초보 개발자의 이야기, 릿허브

[C++] 프로그래머스 124 나라의 숫자 본문

코딩테스트/📘 프로그래머스 (programmers)

[C++] 프로그래머스 124 나라의 숫자

릿99 2021. 11. 19. 09:11
728x90
반응형
1. 문제이해

https://programmers.co.kr/learn/courses/30/lessons/12899

 

코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr

 

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 리턴하는 것이 목표이다.

(124 나라에서 n을 표기하는 방법은 위 표와 같다.)

 

 

 

2. 문제풀이

 

10진수의 n을 124 나라의 숫자로 바꾸는 프로그램을 구현하는 것이 목표이다.

124 나라의 숫자로 바뀐 숫자들을 보면서, 규칙을 찾아내는 것이 가장 중요한데,

아래 그림을 통해 규칙을 파악해보도록 하자.

 

 

124 나라의 숫자들로 변환됫 숫자들을 위와 같은 규칙을 따르게 된다.

우선, 숫자들은 3개씩 짝을 지어 일의 자리 숫자가 1, 2, 4가 반복적으로 나타나게 된다.

즉, n을 3으로 나누었을 때의 나머지에 따라 일의자리 숫자가 1, 2, 4인지가 결정된다는 것이다.

그렇다면, 일의 자리 숫자를 제외한 나머지 자리의 숫자들은 어떨까?

몫과 나머지에 유의하여 위의 예제들을 보면,

다음과 같은 규칙을 통해 124 나라의 숫자들로 변환 할 수 있음을 알 수 있다.

 

1. n을 3으로 나누었을 때의 나머지에 따라 일의 자리 숫자를 지정한 뒤,

2. 만약 몫이 0이 아니라면, 한번 더 나누어 나머지를 한번 더 구한다.

3. 이때의 나머지를 이용해 다음 자리의 숫자를 지정하고, 이를 몫이 0이 될때까지 반복하게 된다.

4. 나온 나머지들에 따른 숫자들을 역순으로 취하면, 124 나라의 숫자로 변환 완료

 

위와 같은 과정을 거치면서, 주의해야 할 점이 한 가지 있는데,

바로 나머지가 0이 되는 경우이다.

나머지가 0이 되는 경우는 쌍으로 묶인 다른 두 경우와는 다르게 몫이 +1 되어서 나오게 된다.

예를 들어, 7, 8, 9 의 경우, 각각 3으로 나눴을 때의 몫이 2, 2, 3 이 나온다.

그런데, 124 나라의 숫자로 보면, 앞 자리는 모두 동일하게 나온다. 몫이 다른데 말이다.

몫이 동일해야 앞 자리 숫자가 동일하게 나올 수 있으므로, 나머지가 0인 경우에는 해당 몫을 -1 해준다.

 

위와 같은 규칙들에 유의해 작성한 코드는 아래와 같으며,

주어진 틀은 다음과 같았다.

 

 

 

3. 소스코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

string solution(int n) {
    string answer = "";
    int share;                  // 몫
    int remainder;              // 나머지
    
    // 몫이 0이되면 더 이상 나눌 수 없으므로 while문 종료
    while(n != 0){
        share = n / 3;
        remainder = n % 3;
        
        // 1. 나머지가 1인 경우
        if(remainder == 1) {
            answer += "1";
            n = share;
        }
        // 2. 나머지가 2인 경우
        else if(remainder == 2) {
            answer += "2";
            n = share;
        }
        // 3. 나머지가 0인 경우
        else if(remainder == 0) {
            answer += "4";
            // 나누어 떨어지기 때문에 몫이 위 두 경우와 달리 +1 되어나온다.
            // 이를 방지하기 위해 몫 - 1 해주어 n을 초기화
            n = share - 1;  
        }   
    }
    
    // 일의 자리부터 입력해준것이므로 문자열을 뒤집어줘야 함
    reverse(answer.begin(), answer.end());

    return answer;
}

2. 문제풀이에서 도출한 풀이 방식에 따라 작성한 코드이다.

몫과 나머지에 해당하는 share, remainder 변수를 설정하고,

몫(share)이 0이 될때까지 while문을 반복한다.

 

while문 안에서는, 주어진 n을 3으로 나누고, 해당 몫과 나머지를 저장한다.

이후, 나머지가 1, 2, 0 인 경우를 나누어 다음과 같은 연산을 진행한다.

 

1. 나머지가 1인 경우

: answer 문자열에 "1"을 추가, n을 몫(share)으로 초기화

 

2. 나머지가 2인 경우

: answer 문자열에 "2"를 추가, n을 몫(share)으로 초기화

 

3. 나머지가 0인 경우

: answer 문자열에 "4"를 추가, n을 몫(share) - 1 로 초기화

 

위와 같은 연산을 진행 후 while문을 빠져나오면,

일의자리를 가장 처음으로 하는 문자열 answer이 나오게 되므로, reverse 함수를 이용해 문자열을 뒤집어준다.

이후 알맞게 변형된 answer를 리턴하게 된다.

 

 


질문과 지적은 언제나 환영입니다.😊

 

 

 

 

 

728x90
반응형