본문 바로가기
프로그래머스 코딩테스트 연습

[프로그래머스 코테 C#] Lv1. 자연수 뒤집어 배열 만들기

by 노재두내 2024. 4. 15.

문제

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

 

조건

n은 10,000,000,000이하인 자연수입니다.

int[] answer = new int[]{};


나의 풀이

생각은 일단, 각 자리 수를 이전에 했던거처럼 나머지 연산을 이용해서 구한 후, 배열의 인덱스 0값부터 집어넣는데 순서를 

 

1. 각 자리 수 구하기

while(n<0)
        {
            int a=(int)n%10;
            n=n/10;
        }

일단 배열에 삽입하고 싶은데 어떻게 해야하는지 모르겠다. 배열 길이가 정해진 것도 아니니..

일단 C# 배열 값 삽입을 쳐보고 , 가변 배열 삽입도 쳐봤으나 다 배열의 길이를 선언해주는거밖에 없었다.

 

그래서 다른 사람 풀이를 봤는데 배열의 길이를 선언해주었다.

int[] answer = new int[]{};

이렇게 주어져 있는데 ,

 

자연수를 Tostring을 이용하여 문자열로 바꾸고 -> .Length를 이용해서 길이를 구해서 

int[] answer = new int[문자열.Length]; 이렇게 선언해줬다.

그래서 구글링 해도 안나오던거였군.. 

 

위를 토대로 이렇게 작성하였다.

using System;

public class Solution {
    public int[] solution(long n) {
        string str=n.ToString(); //정수를 문자열로
        int[] answer = new int[str.Length]; //배열 선언(문자열의 길이 만큼)
        while(n>0)
        {
            int a=(int)n%10;//나머지 5->4->3->2->1
            n=n/10;// 몫 1234->123->12->1
            
            //배열에 a 값 넣기
        }
        
        return answer;
    }
}

1. 정수를 문자열로 바꾼다.

2. 문자열 길이만큼 배열을 선언해준다.

3. 각 자리 수를 1의 자리부터 구한다. => a 

 

근데 !! 배열에 a 값을 어떻게 넣어야할지를 모르겠다.

while문 안에서 넣어야할거같은데

while 문 안에서 for문으로 answer[i]=a; 이렇게 하면 1,1,1,1,1이 저장됨

 

흠냐 다시 한 번 다른 사람들은 어떻게 풀었는지 구글링 해보자..

 

다들 그냥 for문으로 썼다 아? ㅎㅎ 왜 그걸 생각 못했을깡 ~ ㅎ

using System;

public class Solution {
    public int[] solution(long n) {
        string str=n.ToString(); //정수를 문자열로
        int[] answer = new int[str.Length]; //배열 선언(문자열의 길이 만큼)
        
        for(int i=0;i<str.Length;i++)
        {
            int a=(int)n%10;//나머지 5->4->3->2->1
            n=n/10;// 몫 1234->123->12->1
            
            answer[i]=a;//배열에 a 값 넣기
        }
        
        return answer;
    }
}

테스트 케이스는 통과했는데

틀렸다 ..

머가 문제야 

 

생각해보자.

 

혹시 .. 0을 %10으로 하면 안되서 그런가 ..? 

for(int i=0;i<str.Length;i++)
        {
            answer[i]=(int)(n%10);
            n=n/10;
        }

이렇게는 된다.

왜 ? 다른게 뭐야

for(int i=0;i<str.Length;i++)
        {
            //int a=(int)n%10;//나머지 5->4->3->2->1
            //n=n/10;// 몫 1234->123->12->1
            //answer[i]=a;//배열에 a 값 넣기
            
            answer[i]=(int)(n%10);
            n=n/10;
        }

왜 위에는 안되고

아래는 되는거야??

하하 .. 그렇거였군.. 어이없을 무 나 자신

 

 

 

[최종 코드]

using System;

public class Solution {
    public int[] solution(long n) {
        string str=n.ToString(); //정수를 문자열로
        int[] answer = new int[str.Length]; //배열 선언(문자열의 길이 만큼)
        
        for(int i=0;i<str.Length;i++)
        {
            int a=(int)(n%10);//나머지 5->4->3->2->1
            n=n/10;// 몫 1234->123->12->1
            answer[i]=a;//배열에 a 값 넣기
        }
        
        return answer;
    }
}

다른사람 풀이

1. 

using System.Linq;

public class Solution {
    public int[] solution(long n) {
        string nString = new string(n.ToString().ToCharArray().Reverse().ToArray());
        int[] answer = new int[nString.Length];

        for (int i = 0; i < nString.Length; i++)
        {
            answer[i] = int.Parse(nString[i].ToString());
        }

        return answer;
    }
}

n값을 ToString()을 이용해서 문자열로 바꾸고

ToCharArray()를 이용해 문자열을 한 글자씩 쪼개서 이를 char타입의 배열에 집어넣어주고,

Reverse()를 이용해 배열을 뒤집어주고

 

근데 왜 또 ToArray()를 한거징? 

ToArray()를 지우고 실행시켜보니

/Solution0.cs(5,26): error CS1502: The best overloaded method match for `string.String(char[])' has some invalid arguments
/usr/lib/mono/4.5/mscorlib.dll (Location of the symbol related to previous error)
/Solution0.cs(5,64): error CS1503: Argument `#1' cannot convert `System.Collections.Generic.IEnumerable<char>' expression to type `char[]'

요런 오류가 뜬다.

 

아하 .. 확실하진 않지만 new String 선언할때 뒤에는 배열이어야하나?

맞군..

 

 

string testString = "123";
Int32.Parse(testString);

int.Parse는 내가 그동안 썼던. 문자열을 숫자로 바꿔주는것이었따

 

2.

using System;
using System.Linq;

public class Solution {
    public int[] solution(long n) {
        string temp = n.ToString();
        int[] answer = new int[temp.Length];
        
        for(int i = 0; i < temp.Length; i++) 
        { 
           answer[i] = int.Parse(temp[i].ToString());
        }
        
        Array.Reverse(answer);
        return answer;
    }
}

Array.Reverse() 챙겨가면 좋을거같당.

 

3.

while(n > 0)
        {
            answer[idx] = (int)(n % 10);
            n = (n-answer[idx])/10;
            idx++;
        }

그리고 while문 쓰려면 이런식으로 썼으면 됐을거같다.