본문 바로가기
Computer Science/PS

[PS] 12932. 자연수 뒤집어 배열로 만들기

by BrickSky 2023. 11. 18.

1) 문제: 12932. 자연수 뒤집어 배열로 만들기

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

제한사항

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

입출력 예 설명

return
12345[5,4,3,2,1]

 

2) 나의 첫 풀이

마찬가지로 이전에 풀어봤던 문제와 비슷한 것 같다.
숫자를 10으로 나누어 나머지를 배열에 넣어줄 생각이다.

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int* solution(long long n, int result[]) {
    // 리턴할 값은 메모리를 동적 할당해주세요.
    int* answer = (int*)malloc(sizeof(int)*n);
    if(n>=0 && n<=100000000000){
        for(i=0; i<n; i++){
            result[i] = n%10;
        }
    }
    
    return answer;
}
  • 반복문에서 사용되는 변수 i를 선언해주지 않았다.
    • i → int i
  • result 배열을 만들어줄 필요가 없다. 어차피 인덱스로 접근할 것이기 때문에 답이 들어갈 answer배열에 바로 넣어주면 된다.

 

3) 수정한 풀이

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int* solution(long long n) {
    // 리턴할 값은 메모리를 동적 할당해주세요.
    int* answer = (int*)malloc(sizeof(int)*n);
    if(n>=0 && n<=100000000000){
        for(int i=0; i<n; i++){
            answer[i] = n%10;
            n /= 10;
        }
    }
    
    return answer;
}

그러나!
이렇게 하면
입력값이 12345 일때, 기댓값은 [5,4,3,2,1]이 나와야 하는데, 해당 코드를 실행하면 결괏값 [5,4,3,2,0]이 나온다.
마지막 배열에는 0이 아닌 1이 나와야 하는데 즉 마지막 부분은 나머지가 아닌 몫이 출력돼야 하는 것이다.
잘못 생각했다. 마지막 배열에도 역시 나머지가 나오면 된다.
 
헷갈리는 부분이 있어 확실하게 정리하고 넘어가자.

answer[i] = n%10;
n /= 10;

해당 코드는 10으로 나눈 나머지를 배열의 인덱스에 넣어주고, n에 나머지를 무시하고 남은 몫을 나눈 값을 저장하는 것이다.
 

4) 한번 더 수정한 풀이

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int* solution(long long n) {
    // 리턴할 값은 메모리를 동적 할당해주세요.
    int* answer = (int*)malloc(sizeof(int)*1000);
    int i = 0;
    
    if(n>0 && n<=100000000000){
        while(n>0){
            answer[i] = n%10;
            n /= 10;
            i++;
        }
    }
    return answer;
}

 

5) 배운 점

  • 헷갈리는 부분이 있었는데 이번 기회에 확실히 정리할 수 있었다.
    • n /= 10 이 부분을 정확히 모르고 있었다… 부끄럽구나.. 해당 부분을 다시 정리해보자면 위의 부분에서 answer의 인덱스에 나머지 값을 넣어주고 n은 10으로 나눈 몫 부분이 되는 것이다. 123을 예로 들면 10으로 나눈 나머지 3이 answer의 배열에 들어가고 12가 n이 되는 것!
  • 해당 부분을 반복해야하기 때문에 i++이 반드시 있어야 한다. 해당 부분이 없다면 한번 하고 끝나기 때문에 원하는 값을 얻을 수 없다.