본문 바로가기
Problem-solving/프로그래머스

프로그래머스 - 124 나라의 숫자 (C++)

by taehee.kim.dev 2020. 3. 30.
#include <string>
#include <vector>

using namespace std;

/*
    1  -> xx1
    2  -> xx2
    3  -> xx4

    4  -> x11
    5  -> x12
    6  -> x14

    7  -> x21
    8  -> x22
    9  -> x24

    10 -> x41
    11 -> x42
    12 -> x44

    13 -> 111
    14 -> 112
    15 -> 114

*/


string solution(int n) {
    string answer = "";

    // 현재 자리수에는 1들의 묶음, 2들의 묶음, 4들의 묶음 순으로 각 수들의 묶음이
    // 순서대로, 순환적으로 나열되어 있다. n은 각 묶음들의 총 개수.
    // n이 0보다 큰 동안(현재 자리수에 수가 존재하는 동안) 반복한다.
    while(n > 0){
        // n을 3으로 나눈 나머지를 구한다.
        int r = n % 3;
        if(r == 0){
            // 나머지가 0인 경우,
            // 현재 자리의 수가 순환 반복 단위의 끝 수인 경우이다.
            // 반복 단위에서 마지막 수는 4에 해당하므로, 정답의 맨 앞에 4를 추가한다.
            answer = "4" + answer;
            // 현재 자리수에서 3개의 묶음이 다음 자리수의 하나의 수의 묶음이므로,
            // n / 3 의 값은,
            // 다음 앞자리의 수가 1들의 묶음, 2들의 묶음, 4들의 묶음 순으로
            // 각 수의 묶음들이 총 몇 개 있는지가 된다.
            // 하지만 n/3 이후에 1을 빼줘야 한다.
            // 왜냐하면 현재 자리수 묶음들의 한 번의 순환이
            // 다음 자리수에서 맨 앞에 한 번 없기 때문이다.
            n /= 3;
            n -= 1;
        }else{
            /*
                나머지가 0이 아닌 경우, 즉 3으로 나누어 떨어지지 않는 경우.
                이 경우는 현재 자리의 수가 반복 단위의 끝인 수가 아닌 경우이다.
                n % 3의 값은 현재 자리수의 수 이므로, 정답의 맨 앞에 이 값을 추가한다.
            */
            answer = to_string(n % 3) + answer;
            /*
                현재 자리수에서 3개의 묶음이 다음 자리수의 하나의 수의 묶음이므로,
                n / 3 의 값은,
                다음 앞자리의 수가 1들의 묶음, 2들의 묶음, 4들의 묶음 순으로
                각 수의 묶음들이 총 몇 개 있는지가 된다.
                3으로 나누어 떨어지지 않아 소수점 이하의 자리수가 생기지만, 
                정수간의 연산으로 인해 버려지므로
                -1을 할 필요가 없다.
            */
           n /= 3;
        }
    }

    return answer;
}

댓글