본문 바로가기
프로그래머스/Lv.2

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

by MINU.SHINNNN 2023. 10. 9.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

10진법 수 n이 주어졌을 때, 1, 2, 4 3개 숫자로 표현하여 출력해야 하는 문제입니다.

 

10진수를 k 진수로 표현할 때 10진수를 0이 될 때 까지 나누고, 나머지 값인 n % k 를 역으로 이어 붙이게 됩니다. 

https://namu.wiki/w/%EC%A7%84%EB%B2%95

 

진법 - 나무위키

정수 NNN이 밑수 bbb에 대하여 서로 다른 두가지 이상의 표현방법이 존재한다고 가정하자. 그렇다면, 두 표현방법을 각각 N1,N2N_1, N_2N1​,N2​라고 표기하면 다음과 같다. N1=∑i=0maibi=∑i=0mcibi=N2\displ

namu.wiki

하지만 예제에서, 3, 6, 9 등 3으로 나눠 떨어지는 숫자에서  1, 2, 4를 사용해 나타내야 하는 부분에서 문제가 발생합니다.

즉, 3을 3진법으로 나타내면 10(3) 인데, 예제에서는 4 입니다. 규칙이 존재하는데, 현재 값이 나눠 떨어지는 수라면, 몫-1 값이 다음 n이 됩니다.  

 

algorithm 라이브러리의 reverse 함수를 사용해 역순으로 변환해줍니다. 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string str[3] = {"4", "1", "2"};

string solution(int n) {
    string answer = "";
    
    while (n > 0) {
        answer += str[ n % 3];
        if (n % 3 == 0) 
            n = (n / 3) - 1;
        else 
            n = n / 3;
    }
    reverse(answer.begin(), answer.end()); 
    return answer;
}