[알고리즘] 프로그래머스 - 124나라의 숫자

do_large·2021년 2월 16일
0

알고리즘

목록 보기
42/50
post-thumbnail

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

문제설명
124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
1. 124 나라에는 자연수만 존재합니다.
2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

후우....이문제는....
3진수로 접근해야겠다는건 이해했는데,
0을 어떻게 4로 대체해야할지 감이 잘 잡히지 않았다..ㅜㅠ

3진수와 124 나라의 숫자를 비교해보면,
0이 들어간 3진수만 124나라의 숫자로 변경하면 된다.


처음엔 10진수를 toString()메서드를 사용해 3진수로 변경한 뒤 124나라의 숫자로 변경하는 방식을 생각했었다.

예를 들면

이런 방식으로 3진수로 변경한 뒤 그 결과값에 들어있는 0을 4로 변경하는 방식을 생각해봤었는데, 도저히 답을 찾을수가 없었다ㅜㅠ


그래서 3진수를 구하는 과정에서

3진수를 구성하는 값들 중 0이 나올때 마다 즉각적으로 4로 변경하고, 처리를 해주는 방식으로 접근했다.

아래의 그림을 보면 3진수를 구하는 과정에서 나머지가 0인 경우가 나온다면 0을 4로 변경하고, 몫에서 1을 빼준다

이과정이 제일 중요함!!!

코드를 보면 rest가 0일때의 처리가 위에서 말한 내용과 같다.

그리고 n이 0 이하일때 while문을 종료한다. 더이상 나누지 않아도 되기때문에!

그리고 answer에 나머지 값들을 순서대로 넣었기때문에 정답을 도출하려면 answer을 뒤집어야 한다. 문자열을 뒤집는 방법을 구글링 해봤는데 코드에 나온것 처럼 문자열을 배열로 만들고 배열을 뒤집어서 다시 문자열로 합치는 방법이 최선인 것 같다!

function solution(n) {
    let share;
    let rest;
    let answer="";
    while(n > 0){
        share =  parseInt(n / 3);
        rest = n % 3;
        if(rest === 0){
            rest = 4;
            n = share-1;
        }else{
            n = share;
        }
        answer+=rest;
    }
    
    return answer.split('').reverse().join('');
}

0개의 댓글