3진법 뒤집기 - https://programmers.co.kr/learn/courses/30/lessons/68935
요즘 1일 1커밋을 도전하고 있는데,
막상 일하고 수업듣고 하다보니 급하게 쉬운 연습문제로 떼워버렸다ㅠ
그래서 velog에 남기지도 않았던 것 같다
이 문제도 풀고나니 막 생각을 많이 해야하는 문제는 아니어서 약간 양심에 찔리지만..
그래도 작게나마 배운 점이 있어서 남겨본다
1. 10진법을 3진법으로
- 10진법 수를 몫이 0이 나올 때까지 3으로 나눔
- 그 사이에 나온 나머지를 벡터에 기록2. 3진법 앞뒤반전
- pushback을 통해 넣었기 때문에 별도 처리해주지 않아도 됨
3. 3진법을 10진법으로
- 맨 마지막 수 부터 1, 3, 3^2, 3^3.. 으로 곱해서 더해줌
- vector를 거꾸로 조회하려면 rbegin()과 rend()를 사용
(참고: stackoverflow - Iterating C++ vector from the end to the beginning)
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int solution(int n) {
int answer = 0;
// 10진법을 3진법으로
// 1. 10진법 수를 몫이 0이 나올 때까지 3으로 나눔
// 2. 그 사이에 나온 나머지를 벡터에 기록
vector<int> ternary;
while(n > 0) {
ternary.push_back(n % 3);
n /= 3;
}
// 3진법 앞뒤반전
// - pushback을 통해 넣었기 때문에 별도 처리해주지 않아도 됨
// 3진법을 10진법으로
// - 맨 마지막 수 부터 1, 3, 3^2, 3^3.. 으로 곱해서 더해줌
int index = 0;
for(vector<int>::reverse_iterator it = ternary.rbegin(); it != ternary.rend(); ++it) {
answer += (*it * pow(3, index++));
}
return answer;
}