본문 바로가기

About/Algorithm

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

출처. 프로그래머스 연습문제

https://programmers.co.kr/

 

프로그래머스

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

programmers.co.kr

처음에 문제를 잘못 이해해서 오래걸린 문제다.

 

1 - 1

2 - 2

3 - 4

4 - 11

5 - 12

6 - 14

7 - 21

8 - 22

9 - 24

10 - 41

11 - 42

12 - 44

13 - 111

 

이런식으로 수가 증가한다.

 

숫자가 1, 2, 4 밖에 없는 3진수라고 생각하고 푸니까 풀렸다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
string solution(int n) {
    string answer = "";
    string num_arr[3= {"4","1","2"};
 
    for (int i = 1; i <= n; i *= 3) {
        answer += num_arr[int((n / i)) % 3];
        n -= i;
    }
    reverse(answer.begin(), answer.end());
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

복잡하지만 코드를 보자면

 

1 .n을 1,3,9,...를 순서로 나눈 몫을 구한다

2. 해당 몫을 3으로 mod 연산해서 해당 값을 index로 num_arr에서 문자를 가져와 answer에 추가한다.

3. n에서 1, 3, 9,..를 순서로  빼주었다.

4. string 을 reverse 함수로 뒤집어서 값을 구했다. ( 작은 숫자부터 처리했지만 큰 수부터 적기 때문에)

 

11을 예로 들어보자

 

첫번째루프 i = 1

- 11 / 1 = 11

- 11 % 3 = 2

- num_arr[2] = "2"

- n - 1 = 10

- answer = "2"

두번째루프 i = 3

- 10 / 3 = 3 

- 3 % 3 = 0

- num_arr[0] = "4"

- n - 3 = 7

- answer = "24"

 

그 후 i*3 > n ( 9 > 7 ) 이기 때문에

for loop 가 끝이나고

 

answer 을 reverse 함수취하고 나면

"42"가 된다.