알고리즘/프로그래머스

코딩테스트 연습 / 연습문제 / 124 나라의 숫자 / JAVA

외계공룡 2020. 4. 23. 16:35

 

문제 풀이

class Solution {
  public String solution(int n) {
    String answer = "";
    
    StringBuilder sb = new StringBuilder();
    char[] num = {52,49,50}; //4,1,2
    
    while(n > 0){
        sb.insert(0,num[n%3]);
        n = (n - 1) / 3;
    }
    
    answer = String.valueOf(sb);
    return answer;
  }
}

이 문제는 약간의 응용력이 들어간 문제이기 때문에 접근방법에 주의해야 합니다.

평소에 2진수 변환 같은 문제를 풀어보지 못한 사람은 잘 생각하지 않으면 어려울 수도 있는 문제입니다.

저 같은 경우에는 처음에 n을 log로 나누려고 했는데 Math.log3()이 자바에서 없다는것을 깨달았습니다.(나중에 여유가 된다면 등차수열을 공부좀 해봐야될것 같습니다.)

 

이 문제의 핵심은 1,2,4가 아닙니다.

만약 첫째자리를 1, 2, 4중 만들고 두번째 자리가 오면 append를 해야지 하는 생각을 하시면 문제가 조금 어려워집니다.

이 문제의 핵심은 3입니다.

 

10진수를 2진수로 변환할때처럼 n이 0이 될때까지 계속 3으로 나눠서 자릿수를 먼저 구하는 것이 핵심입니다.

자릿수를 구하면 각 자리수에 맞게 1,2,4를 치환해주시면 됩니다.

 

위의 코드를 보시면 52, 49, 50은 각각 4, 1, 2의 아스키코드입니다.

52를 앞으로 먼저 놔둔 이유는 n = 3이라고 가정했을때 n % 3은 0이 되므로 좀 더 식이 간편해집니다.

대신 증감식은 (n-1) / 3 으로 해야합니다. n이 3이라고 가정했을때 증감식에 의해 1이 되므로 while문을 한번 더 돌게 되기 때문입니다.  

그리고 진법변환시 나머지값은 앞에서부터 나오므로 StringBuilder의 insert()메소드를 이용하여 앞에다 붙여줍니다. 

 

 

히스토리

 

chucoding/algorithm

알고리즘 문제풀이 사이트 도전~!! . Contribute to chucoding/algorithm development by creating an account on GitHub.

github.com