발자취
[프로그래머스 Lv.1 / C언어] Day9. 자연수 뒤집어 배열로 만들기 본문
2024. 05. 26 - 코딩테스트 스터디 Day9
01. 문제 설명
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를 들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
02. 제한사항
- n은 10,000,000,000이하인 자연수입니다.
03. 입출력 예
| n | return |
| 12345 | [5,4,3,2,1] |
04-1. 풀이 및 답
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int* solution(long long n) {
int* answer = (int*)malloc(sizeof(int) * 11);
for (int i = 0; i < 11; i++) {
answer[i] = n % 10;
n /= 10;
}
return answer;
}
answer라는 포인터를 선언하고, malloc 함수를 통해 동적 메모리를 할당해 줬다.
제한사항에서 n은 11자리 수인 10,000,000,000 이하라고 했으므로, 크기 11짜리 int 배열을 만들어줬다.
for문을 총 11번 돌면서 n을 10으로 나눈 나머지를 answer 배열에 저장해 주고, n을 10으로 나누는 과정을 반복한다.
반복이 끝난 후 answer를 반환해 준다.
동작 예) n == 12345
12345 % 10 = 5 → answer[0] = 5
12345 / 10 = 1234 → n = 1234
1234 % 10 = 4 → answer[1] = 4
1234 / 10 = 123 → n = 123
123 % 10 = 3 → answer[2] = 3
123 / 10 = 12 → n = 12
12 % 10 = 2 → answer[3] = 2
12 / 10 = 1 → n = 1
1 % 10 = 1 → answer[4] = 1
1 / 10 = 0 → n = 0
04-2. 풀이 및 답 ★
위 동작 예시를 작성하다 보니 새로운 아이디어가 떠올라 코드를 한번 더 작성해 보았다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int* solution(long long n) {
int* answer = (int*)malloc(sizeof(int) * 11);
int i = 0;
while (n) {
answer[i++] = n % 10;
n /= 10;
}
return answer;
}
이번에는 while문을 사용하여 반복문을 돌도록 만들었다.
while문의 조건으로 n을 넣어주면, n이 0이 되었을 때 반복문을 빠져나갈 수 있다.
위에서 동작 예시를 작성하면서 n을 n의 자릿수 횟수만큼 나누면 0이 된다는 것을 알았기 때문에 이런 코드를 작성해 볼 수 있었다.
4-1 풀이에서는 n이 11자리의 수가 아니더라도 반복문을 무조건 11번 돌아야 했는데,
이렇게 코드를 수정하면 n의 자릿수만큼만 반복할 수 있어 불필요한 연산을 하지 않아 더 효율적이다.


두 코드 모두 정답!

오늘은 두 코드 모두 한 번에 정답 판정을 받아서 굉장히 행복했다 흐흐
'코딩테스트 > Daily Coding (C, C++)' 카테고리의 다른 글
| [프로그래머스 Lv.1 / C언어] Day11. 정수 제곱근 판별 (0) | 2024.05.28 |
|---|---|
| [프로그래머스 Lv.1 / C++] Day10. 정수 내림차순으로 배치하기 (0) | 2024.05.27 |
| [프로그래머스 Lv.1 / C언어] Day8. 자릿수 더하기 (0) | 2024.05.25 |
| [백준 / C언어] Day7. 균형잡힌 세상 (4949) (0) | 2024.05.24 |
| [백준 / C언어] Day6. 괄호 (9012) (0) | 2024.05.23 |