1) 문제: 12932. 자연수 뒤집어 배열로 만들기
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
제한사항
• n은 10,000,000,000 이하인 자연수입니다.
입출력 예 설명
n | 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++이 반드시 있어야 한다. 해당 부분이 없다면 한번 하고 끝나기 때문에 원하는 값을 얻을 수 없다.
'Computer Science > PS' 카테고리의 다른 글
[PS] 12947. 하샤드 수 (1) | 2023.11.19 |
---|---|
[PS] 12934. 정수 제곱근 판별 (0) | 2023.11.19 |
[PS] 12925. 문자열을 정수로 바꾸기 (2) | 2023.11.18 |
[PS] 12931. 자릿수 더하기 (1) | 2023.11.18 |
[PS] 12937. 짝수와 홀수 (1) | 2023.11.17 |