[프로그래머스] 월간 코드 챌린지 시즌1 > 3진법 뒤집기

박민주·2022년 3월 9일
0

Programmers

목록 보기
13/13

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;
}
profile
Game Programmer

0개의 댓글