[프로그래머스][C++] 3진법 뒤집기
3진법 뒤집기Permalink
문제 링크Permalink
분석Permalink
주어진 정수를 3진법으로 변환하고, 뒤집은 3진수를 다시 10진법으로 변환해서 반환하는 문제입니다.
정수를 3으로 몫이 0이 될때까지 반복하면서 나오는 나머지들을 역순으로 나열하면 3진법으로 변환된 숫자가 됩니다.
예시는 다음과 같습니다
45÷3=15(나머지 0)
15÷3=5(나머지 0)
5÷3=1(나머지 2)
1÷3=0(나머지 1)
나머지를 역순으로 나열하면 1200이 됩니다.
3진수를 다시 10진법으로 변환하기 위해서는 각 자릿수에 3의 지수를 곱하면 됩니다.
1200이라는 3진수를 다시 10진법으로 변환하기 위해서는 다음과 같습니다.
1×33=1×27=27
2×32=2×9=18
0×31=0×3=0
0×30=0×1=0
이 결과를 모두 더하면 됩니다.
27+18+0+0=45
하지만 본 문제에서는 3진수를 뒤집기 때문에 다시 10진법으로 변환할 때 값이 달라져야 합니다.
풀이Permalink
#include <vector>
int solution(int n) {
int answer = 0;
std::vector<int> vec;
while (n)
{
vec.push_back(n % 3);
n /= 3;
}
int power = 1;
for (int i = vec.size() - 1; i >= 0; --i)
{
answer += vec[i] * power;
power *= 3;
}
return answer;
}
첫 while문
에서 3진법으로 변환한 값을 구합니다.
이때 vector
의 값은 3진법으로 변환하며 뒤집힌 상태이기 때문에, 10진수로 바꿀 때 순서대로 접근해 계산했습니다.
성능 요약Permalink
테스트 1 〉 통과 (0.01ms, 4.21MB)
테스트 2 〉 통과 (0.01ms, 3.74MB)
테스트 3 〉 통과 (0.01ms, 4.14MB)
테스트 4 〉 통과 (0.01ms, 3.68MB)
테스트 5 〉 통과 (0.01ms, 3.64MB)
테스트 6 〉 통과 (0.01ms, 4.21MB)
테스트 7 〉 통과 (0.01ms, 4.2MB)
테스트 8 〉 통과 (0.01ms, 4.2MB)
테스트 9 〉 통과 (0.01ms, 3.67MB)
테스트 10 〉 통과 (0.01ms, 4.15MB)
댓글남기기