발자취

[프로그래머스 Lv.1 / C언어] Day9. 자연수 뒤집어 배열로 만들기 본문

코딩테스트/Daily Coding (C, C++)

[프로그래머스 Lv.1 / C언어] Day9. 자연수 뒤집어 배열로 만들기

해린 2024. 5. 26. 03:11

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의 자릿수만큼만 반복할 수 있어 불필요한 연산을 하지 않아 더 효율적이다.

 

 

두 코드 모두 정답!

 

 

 


오늘은 두 코드 모두 한 번에 정답 판정을 받아서 굉장히 행복했다 흐흐