https://school.programmers.co.kr/learn/courses/30/lessons/68935
이 문제는 2진법을 만드는 것과 유사하다.
3진법은 0, 1, 2로 수를 표현하는 기법이다.
따라서 주어진 n을 3으로 나눈 나머지를 저장하면 10진법을 3진법으로 표현할 수 있다.
makeNumber함수는 10진법의 수를 3진법으로 변환하는 함수이다.
이때 배열에 저장 된 값은 앞뒤가 반전된 3진법으로 저장된다.
따라서 배열의 가장 뒷요소는 3진법의 0의 자리이기 때문에 10진법으로 변환 시 그대로 answer에 저장하면 된다.
마지막으로 1의 자리부터 3의 n승을 통해 값을 누적하면 문제를 해결할 수 있다.
#include <string>
#include <vector>
using namespace std;
vector<int> number;
void makeNumber(int n){
if(n < 3){
number.push_back(n);
return;
}
while(n >= 3){
number.push_back(n%3);
n /= 3;
}
number.push_back(n);
}
int solution(int n) {
int answer = 0;
makeNumber(n);
answer = number[number.size() - 1];
int key = 1;
for(int i = number.size() - 2;i>=0;i--){
int temp = 1;
for(int j = 0;j < key;j++){
temp *= 3;
}
answer += number[i] * temp;
key++;
}
return answer;
}
'Programmers Review' 카테고리의 다른 글
[Lv 1] 최소직사각형 (0) | 2024.06.07 |
---|---|
[Lv 1] 신규 아이디 추천 (0) | 2024.06.04 |
[Lv 1] 두 개 뽑아 더하기 (0) | 2024.06.04 |
[Lv 1] 실패율 (0) | 2024.06.04 |
[Lv 1] 비밀지도 (0) | 2024.06.01 |