프로그래머스의 3진법 뒤집기 문제이다.


[ 문제풀이 ]

주어진 값을 3진수로 바꾼 후, 바꾼 3진수의 값을 뒤집고, 그 뒤집은 값을 다시 10진수로 변환한 값을 출력해야 하는 문제이다.

그럼 순차적으로 진행해보자.


#1. 3진수로 변환하기

3진수로 변환하는 것은 2진수로 변환하는 것과 마찬가지로 해당 숫자가 더 이상 나눌 수 없을 때 까지 3으로 나눈 나머지들을 계속해서 저장하면 된다.

45라는 숫자를 예시로 진행해보자.

45를 3으로 나누게 되면 45는 15가 되고, 나머지는 '0'이 발생하게 된다.

15를 3으로 나누게 되면 15는 5가 되고, 나머지는 '0'이 발생하게 된다.

5를 3으로 나누게 되면 15는 1이 되고, 나머지는 '2'가 발생하게 된다.

1을 3으로 나누게 되면 1은 0이 되고, 나머지는 '1'이 발생하게 된다.

그리고 이 나머지들을 역순으로 그대로 적어보면, '1200' 이라는 3진수가 된다.


본인은 이 나머지들을 문자열을 이용해서 저장해 주었다.

또한, 나머지를 처음 나오는 값들부터 그냥 순차적으로 저장해 주었다.

즉, 문자열에 저장해줄 때, '1200'이 아닌, '0021'의 순서대로 저장을 해 주었다.

왜냐하면, 어차피 그 다음 단계에서 이 값을 뒤집는 과정이 필요하다.

따라서, 애초에 뒤집은 결과값을 3진수로 변환하면서 같이 저장해 주었다.


#2. 10진수로 바꾸기

10진수로 바꾸는 것은 다시 3의 0승부터 K승까지 계속해서 곱해주는 것과 같다.

'0021'에서 '1'은 3^0과 곱하고, '2'는 3^1과 곱하고, ....

이런식으로 반복적인 연산을 통해서 값을 도출해 주었다.


[ 소스코드 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <string>
#include <vector>
#include <cmath>
 
using namespace std;
 
string Invert_Three(int n)
{
    string Result = "";
    while (n > 0)
    {
        char Temp = (n % 3+ '0';
        Result += Temp;
        n /= 3;
    }
    return Result;
}
 
int Invert_Ten(string S)
{
    int Result = 0;
    int P = 0;
    for (int i = S.length() - 1; i >= 0; i--, P++)
    {
        int Num = S[i] - '0';
        int Value = pow(3, P) * Num;
        Result += Value;
    }
    return Result;
}
 
int solution(int n) 
{
    int answer = 0;
    string Three = Invert_Three(n);
    answer = Invert_Ten(Three);
    return answer;
}
cs



+ Recent posts