1. 문제 설명

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

 

- 제한 사항

  • n은 1 이상 100,000,000 이하인 자연수입니다.

2. 풀이 코드

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;

    vector<int> arr = {};


    while (n > 0)
    {
        arr.push_back(n % 3);
        n /= 3;
    }

    int root = 1;

    for (int i = arr.size()-1; i >= 0; i--)
    {
        answer += arr[i] * root;
        root *= 3;

    }


    return answer;
}

 

3. 정리

나머지 연산을 통해 3진법을 구한다. push_back 함수를 써서 배열에 넣으면 마치 뒤집어진 것처럼 배열에 들어간다.

그리고 나서 1의 자리부터 3진법->10진법 변환 작업을 해야하므로 배열의 뒤부터 접근하여 계산하다.

 

전체 시간 복잡도는 O(log n) +  O(log n) =  O(log n)

1. n이 while문에서 3으로 0이 될때까지 계속 나누므로 시간 복잡도가 O(log n)이다.

2. 다음 for문에서 1번에서 순회할 크기가 log n 만큼 작아졌으므로 시간복잡도가 O(log n) 이다.

 

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

+ Recent posts