본문 바로가기
Algorithm/프로그래머스

[프로그래머스]연습문제 : 124 나라의 숫자 (level 2) (c++)

by HBGB 2020. 4. 30.

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

 

프로그래머스

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

programmers.co.kr

 

 

방법 1: 바로 변환

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <string>
#include <vector>
 
using namespace std;
 
string solution(int n) {
 
    string answer = "";
    // 3 진법 012 = 124나라의 412
    char num[] = { '4''1''2' };
 
    while (n > 0)
    {
        int rest = n % 3;
        n /= 3;
 
        // 124나라에는 0이 없기 때문에 나머지가 0일 경우, n -= 1
        if (rest == 0)
        {
            n--;
        }
 
        answer = num[rest] + answer;
    }
 
    return answer;
}
Colored by Color Scripter

 

방법 2: 3진법 저장 후 변환

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <string>
#include <vector>
 
using namespace std;
 
// 3진법 수 구하기
string get_ternary(int n)
{
    if (n == 0)
    {
        return "";
    }
 
    return get_ternary(n / 3).append(to_string(n % 3));
}
 
string solution(int n) {
 
    string tri = get_ternary(n);
 
    // 뒤에서부터 0이면 전체수 - 1 한 뒤, 0 --> 4로 교환
    for (int i = tri.size() - 1; i > 0; i--)
    {
        if (tri[i] == '0')
        {
            tri[i - 1-= 1;
            tri[i] = '4';
        }
        else if (tri[i] < '0')
        {
            tri[i - 1-= 1;
            tri[i] += 3;
        }
    }
 
    if (tri[0== '0')
    {
        return tri.substr(1);
    }
 
    return tri;
}
Colored by Color Scripter

 

 

방법2는 볼거 없다. 그냥 내 삽질흔적의 기록이다 ㅋㅋ

방법1은 프로그래머스 다른 분 풀이를 참고한 것이다.

 

TIP1

숫자 3개만으로 나타낸다는 점에서 3진법을 활용해야 한다는 것을 알 수 있다.

 

 

TIP2

그러나 124 나라에는 숫자 0이 없기 때문에 역시 보통 3진법이 아니다.

나머지가 0이 나올때마다 숫자가 1씩 차이가 날것인데,

그냥 1을 빼주면 된다.

 

댓글