GitHubSeob

C++ / 프로그래머스 / 3진법 뒤집기 본문

Programmers/Level 1

C++ / 프로그래머스 / 3진법 뒤집기

GitHubSeob 2021. 8. 21.

문제

https://programmers.co.kr/learn/courses/30/lessons/68935

 

코딩테스트 연습 - 3진법 뒤집기

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 1 이상 100,000,000 이하인 자연수

programmers.co.kr

문제풀이

3진법은 0, 1, 2로만 이루어진 숫자이다.

원래 n을 3으로 나누고 나머지를 적고, n을 더 이상 나눌 수 없을 때까지 반복한 뒤 나머지를 거꾸로 적어야 하지만 이 문제에서는 3진법 된 수를 뒤집어야 하므로 나머지가 나오는 대로 바로 벡터에 push 하면 된다.

앞뒤가 반전된 3진법이 나오게 되면, 맨 오른쪽 자리부터 왼쪽으로 가면서 해당 자리 숫자 *1, *3, *9, *27,..., 3의 제곱수를 곱해주면 10진법으로 표현된 수가 나온다.

 

코드

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    vector<int>ternary_scale;
    while (n > 0) {
        ternary_scale.push_back(n % 3);
        n /= 3;
    }
    int mul = 1;
    for (int idx = 0; idx < ternary_scale.size(); ++idx) {
        answer += (mul * ternary_scale[ternary_scale.size() - idx - 1]);
        mul *= 3;
    }
    return answer;
}