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

ynoolee·2021년 12월 20일
0

코테준비

목록 보기
75/146
post-custom-banner

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

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

생각 1 :

규칙을 찾기

3진법과 비슷한 규칙을 찾아야할 것 같다

생각 2 :

나는 규칙을 잘 못찾기에 등비수열로 풀어보려고 했었다.

그런데 이거를 못하겠어서 다시 생각1로 돌아왔다.


나는 규칙을 잘 못 찾는다..

따라서 많은 경우를 그림으로 그려보았다.

따라서

3진법으로의표기한 수를 → 124 수로 바꾸는 과정의 함수 convert를 작성했다.

여기서 주의할 것은

0이 반복되는 경우다

  • 한 번에 하나의 0만을 없애줘야 한다.
  • 뒤에 자리의 0인 부분을 없애주려다가, 앞자리에 0이 생기기도 한다.
  • 따라서 매번, 모든 자리수를 탐색하며 처음으로 0 이 나올 때 까지 탐색 → 0이 나온부분을 없애줌 → 종료 → 다시 처음부터 탐색 → 0 나올 때 까지 탐색 → 0 이 나온 자리를 없애줌 →....... 을 반복하는데, 0인 부분이 없을 때 까지 반복
  • 여기서 “ 0 이 나온 부분을 없애줌” 이라는 것은 [ 앞 자리를 -1 && 0인 자리에 3을 위치시킴 ] 을 의미한다.
    // result를 변환한다 : 0 인 자리를 채워 나간다 
    public void convert(){
        // 1101001 이런 경우 또한 고려해야함. 
        // 변환시킨 부분이 없을 때 까지 반복한다. 
        while(recurConvert());
        
    }
    // 변환시킨 부분이 있으면 true 
    public boolean recurConvert(){
        for ( int i = cnt; i > 0 ;i--){
            if( result[i-1] == 0){
                result[i]--;
                result[i-1]=3;
                return true;
            }
        }
        return false;
    }
class Solution {
    public int[] result = new int[1000]; // 임의의 길이로 세팅. 여기서는 1,2,4로만 표현하니 0 -> 없는 수 
    public int cnt = 0; 
    
    public String solution(int n) {
        String answer = "";
        createThree(n);
        convert();
        // printResult();
        answer = trim();
        
        return answer;
    }
    public void createThree(int n){
        int cur = 0;
        int target = n;
        while(target/3 != 0){
            cur = target % 3;
            result[cnt++] = cur;
            target /= 3;
        }
        result[cnt] = target %3;
    }
    // result를 변환한다 : 0 인 자리를 채워 나간다 
    public void convert(){
        // 1101001 이런 경우 또한 고려해야함. 
        // 변환시킨 부분이 없을 때 까지 반복한다. 
        while(recurConvert());
        
    }
    // 변환시킨 부분이 있으면 true 
    public boolean recurConvert(){
        for ( int i = cnt; i > 0 ;i--){
            if( result[i-1] == 0){
                result[i]--;
                result[i-1]=3;
                return true;
            }
        }
        return false;
    }
    public void printResult(){
        for(int i = cnt;i>=0;i--)
            System.out.print(result[i]);
        System.out.println();
    }
    // 124 나라 수로 변환한다. 맨 앞자리에 0 인 부분은 제외하고 문자열로 만든다. 
    // 0112 -> 112 가 되는 거임 
    public String trim(){
        int temp = 0; 
        StringBuilder sb = new StringBuilder("");
        for(int i = cnt ; i >= 0 ; i--){
            if((temp = result[i]) != 0){
                if(temp==3) sb.append("4");
                else sb.append(Integer.toString(temp));
            }
        }

        return sb.toString();
    }
    
}
post-custom-banner

0개의 댓글