문제 설명
124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
- 124 나라에는 자연수만 존재합니다.
- 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
10진법 | 124 나라 | 10진법 | 124 나라 |
1 | 1 | 6 | 14 |
2 | 2 | 7 | 21 |
3 | 4 | 8 | 22 |
4 | 11 | 9 | 24 |
5 | 12 | 10 | 41 |
자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/12899#
제한 사항
- n은 50,000,000이하의 자연수 입니다.
풀이
문제를 읽으면 바로 3진법으로 변환하면 되겠다고 생각이 들것이다.
보통 진법 변환은 재귀함수를 이용하여 구현할 수 있다.
하지만, 이 문제는 다른 진법 변환과 조금 다르다.
왜냐하면 0이 존재하지 않기 때문이다.
하지만, 한 가지 트릭을 이용하면 문제를 쉽게 풀 수 있다.
문제에서는 124나라에 있다.
124라는 수를 보면 감이 잡힐 것이다.
바로 $2^n$이라는 점이다.
즉, 문제를 해석하면 어떤 수 n을 [0, 1, 2]로 변환하면 된다.
그럼 이제 변환하는 방법을 알아보자.
여기서 주의해야 할 부분이 0이 없다는 점이다.
0이 없기 때문에 수를 1씩 빼서 계산해야 한다.
즉, 1 → 0, 2 → 1, 3 →2가 된다.
진법을 변환하기 전에 1을 빼고 시작해야 된다는 뜻이다.
또한, 다음 재귀로 수를 넘길 때도 1을 빼야 한다.
같은 이유이다.
0,1,2로 변환을 완료했다면 2의 제곱을 계산하여 문자열에 더하면 된다.
전체 코드
#include <string>
#include <vector>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
void convert(vector<int>& numbers, int n)
{
if(n < 3)
{
numbers.push_back(n);
return;
}
convert(numbers, n/3 - 1);
numbers.push_back(n%3);
}
string solution(int n) {
string answer = "";
vector<int> converted;
convert(converted, n-1);
for(auto c : converted)
{
int temp = pow(2,c);
answer += temp+'0';
}
return answer;
}