출처. 프로그래머스 연습문제
처음에 문제를 잘못 이해해서 오래걸린 문제다.
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"가 된다.
'About > Algorithm' 카테고리의 다른 글
[프로그래머스][C++] 카카오 프렌즈 컬러링 북 (0) | 2020.03.28 |
---|---|
[프로그래머스][C++] 스킬트리 (0) | 2020.03.28 |
[프로그래머스][C++] 땅따먹기 (0) | 2020.03.28 |
[프로그래머스][C++] 가운데 글자 가져오기 (0) | 2020.03.26 |
[프로그래머스][C++, Python]소수 찾기 문제 ( 에라토스테네스의 체 ) (0) | 2020.03.26 |