[프로그래머스] 124 나라의 숫자

yeong·2022년 6월 17일
0

알고리즘

목록 보기
3/5

문제:
https://programmers.co.kr/learn/courses/30/lessons/12899#
난이도 : level2

문제 접근 :
10진법 숫자를 124진법으로 변환하는 문제이다. 1,2,4 세개의 숫자이므로 3진법 변환과 유사하다.
그런데 해당 문제는 0이 아닌 4가 있음을 유의해야한다.

문제 풀이
우선 3으로 나누어떨어지는 수를 처리해야한다. 만약 9를 일반 3진법으로 변환했다면 10이 된다. 그러나 테스트 케이스에서 input이 9일 경우 24가 출력된다. 또한 3일 경우는 4가 된다.
이를보았을때 나머지가 0으로 나누어 떨어지는경우 0인 나머지를 4로만들고, 몫에서 1를 차감한다는것을 알 수 있다.

mod = 9 % 3 ;
if (mod===0)
mod =4
n = n/3-1;

이 필요함을 알 수 있다.

첫번째 제출

위 로직을 반영해서 첫번째 코드를 제출했다.
mod가 0일 경우 n에서 1을 차감하고 mod 는 4로 초기화하며, mod 가 0이 아닐경우는 n만 n/3의 몫으로 바꾸도록 작성했다

function solution(n) {
    
    let lookup ={}
    let answer=''
    let firtN = n ;
    while(n>0){
        let mod = n%3;
        if(mod===0){
            n =  Math.floor(n/3 -1)  
            mod = 4
        }else{
            n = Math.floor(n/3)
        }
        answer = mod + answer
    }
    return answer;
}

수정 제출

조금 더 좋은 방식이 있을까 다른 코드들을 살펴보다가 나머지를 인덱스로 처리한 코드를 보아서 참고하였다ㅠㅠ 정말 생각치도 못한 방법,,,
그리고 처음 제출한 코드에서는 n을 나머지에 따라 분기처리하였는데, n을 분기처리 하지않고 무조건 차감한 코드를 발견하였다.
잘 생각해보니 Math.floor()로 처리한다는 점에서 n을 분기처리할 필요가 없었다.
만약 경계라인인 즉, 3으로 나누어 떨어지는 경우 어차피 1을 차감해주어야하므로 floor로 강제내림 되어야한다.
만약 -1을 함으로서, 3으로 나눠떨어지는 값이 되는경우, -1을 하지않을 경우 숫자 n+0.xx 에서 o.xx는 Math.floor()에 의해 사라지므로 동일한 결과가 된다.
다른 경우도 모두 3으로 나누어떨어지지않는 값은 다 강제 내림되므로 n-1을 선행해도 차이가 없다.


function solution(n) {
    
    let lookup ={}
    let src =[4,1,2]
    let answer=''
    let firtN = n ;
    while(n>0){

        
        let mod =src[n%3] ;
        n = Math.floor((n-1)/3);
      
    answer = mod + answer
        
    }
    return answer;
}

성능

두 로직간에 성능에 유의미한 차이는 없었다.

profile
안녕하세요!

0개의 댓글