연습장

월간 코드 챌린지 시즌1 > 3진법 뒤집기

anothel 2021. 11. 27. 09:59

문제 설명

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


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

입출력 예

n result
45 7
125 229

입출력 예 설명

입출력 예 #1

  • 답을 도출하는 과정은 다음과 같습니다.
n (10진법) n (3진법) 앞뒤 반전(3진법) 10진법으로 표현
45 1200 0021 7
  • 따라서 7을 return 해야 합니다.

입출력 예 #2

  • 답을 도출하는 과정은 다음과 같습니다.
n (10진법) n (3진법) 앞뒤 반전(3진법) 10진법으로 표현
125 11122 22111 229
  • 따라서 229를 return 해야 합니다.

 

Solution

#include <cmath>
#include <string>
#include <vector>

using namespace std;

int solution(int n) {
  int result = 0;
  vector<int> v;
  while (n) {
    v.push_back(n % 3);
    n /= 3;
  }
  for (int i = v.size() - 1, j = 0; 0 <= i; i--, j++) {
    result += v.at(i) * pow(3, j);
  }

  return result;
}

 

남의 코드

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    vector<int> v;
    while(n > 0){
        v.push_back(n%3);
        n/=3;
    }
    int k = 1;
    while(!v.empty()) {
        answer += k*v.back();
        v.pop_back();
        k*=3;
    }

    return answer;
}

 

후기

3진법의 수를 만들서 벡터에 넣고 그걸 다시 거꾸로 꺼내오면서 10진법을 만들어서 return 하는 방법으로 문제를 풀었다. 남의 코드를 봤을 때 그들도 비슷하게 풀었더라.

 

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

 

728x90