본문 바로가기

알고리즘

124 나라의 숫자(lv2)

반응형
문제 설명

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

  1. 124 나라에는 자연수만 존재합니다.
  2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

10진법124 나라10진법124 나라
1 1 6 14
2 2 7 21
3 4 8 22
4 11 9 24
5 12 10 41

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

제한사항
  • n은 50,000,000이하의 자연수 입니다.

입출력 예nresult
1 1
2 2
3 4
4 11

20220906 진행중인코드

더보기

아!.. 대충 뭔지는 알겠는데.. 이걸 코드로 어떻게 표현하지?? 전직장 동료의 풀이법을 빌려서 해보도록 하자.

 

1. 124 나라에선 사실상 3진법과 다름이 없다. 다만 숫자표현이 1,2,4 일뿐, 그렇기 때문에 3/4 -> 몫1, 나머지1로 자릿수가 하나 올라가고, 나머지1이 붙어서 11이다.

2. 하나 더 예를들어 10을 보면 3/10 -> 몫 3, 나머지가 1로 3에 해당하는 4, 그리고 나머지 1이 붙어 41이다.

3. 즉, 나머지로 맨끝 수가 결정되고(1,2 -> 1,2, 그대로 맵핑, 0으로나눠 떨어지면 4이다.)

4. 몫으로 마지막 자리수를 제외한 모든게 결정된다.

5. 그럼 몫은 어떻게?... 

6. 계속 계산해보니 몫도 3으로 나누어 떨어질때까지 진행하며, 각 나머지가 자릿수가 된다.

 

 

그런데!... 오류가 난닷! 

1. 나누어떨어질 경우 무한루프

2. 왜인지 모르나 거꾸로 나올때도 있음

class Solution {
    public String solution(int n) {
        String answer = "";
        
        int a=0;
        int b=0;
        String tmpAnswer = "";

        while(a!=1){
            a = number/3;
            b = number%3 == 0 ? 4 : number%3;
            tmpAnswer += b;
            if(a==1){
                tmpAnswer+=a;
            }
            number = a;
        }

        Arrays.stream(tmpAnswer.split("")).sorted(Comparator.reverseOrder()).forEach(s->{
            System.out.print(s);
        });
        
        return answer;
    }
}

20220907 진행중인 코드

더보기

아침이란 그런가.. 머리가 잘 안돌아감... 그냥 30분동안 쳐다보고 조금이나마 고민했음에 만족하자... 이것도 못할지도..

- 변수명을 a,b에서 좀더 의미 있게 바꿨다.

- 반복문을 while문에서 do while문으로 바꿨다.

  - while문으로 하면 반복문조건에서 뭔가 안맞는게 생긴다. 

public int solution(int number){
        int portion=0;
        int remainder=0;
        String tmpAnswer = "";
        String answer="";

        do{
            portion = number/3;
            remainder = number%3 == 0  ? 4 : number%3;

            number = portion;

            tmpAnswer+=remainder;
        }
        while(portion>=1);

        Arrays.stream(tmpAnswer.split("")).sorted(Comparator.reverseOrder()).forEach(s->{
            System.out.print(s);
        });

    }

20220908 진행중인 코드

더보기

테스트케이스는 통과하는데 제출시 실패함... 그것도 엄청 많이.. 왜지 ㅡㅡ?... 

 

class Solution {
    /**
     * 20220908
     * 1. 파라미터를 3으로 나눈다.
     * 2. 나머지 값이 0일 경우 4로, 나머지는 그대로 마지막 자릿수부터 채운다.
     * 3. 1~2과정을 1에서 나온 몫에 대해 반복한다.
     * 4. 언제까지? 몫이 3이하가 나올때까지!..
     * @param number
     */
    public String solution(int number) {
        int portion=4; //while 문 초기에 걸리지 않기 위한 초기값
        int remainder=0;
        StringBuilder tmpAnswer = new StringBuilder();
        String answer="";

        while(portion>3){
            //1~3은 바로 리턴한다.
            if(number<=3){
                return Integer.toString(number==3?4:number);
            }

            //나머지가 0이면 4로 매핑, 이외의 경우니 1,2는 그대로 사용한다.
            remainder = number%3 == 0  ? 4 : number%3;
            tmpAnswer.append(remainder);

            portion = number/3;

            //사실상 3진법이기 때문에 3이하는 몫을 그대로 첫째 자릿수에 매핑한다. 3은 4로 매핑!
            if(portion<=3 && portion>0){
                tmpAnswer.append(portion==3 ? 4 : portion);
            }
            number = portion;
        }
        answer = tmpAnswer.reverse().toString();
        return answer;
    }
}

20220908 참고풀이

더보기

결국 3일차까지 try했을때 실패해서 풀이를 검색해보았다... 그런데 보니까 결국 방법자체는 나랑 비슷한데, 코드 구현에 있어서 몇가지 빼먹은게 있었다. 첫 lv2도전 이었는데 너무 아쉽다. 몇일차다, 시간이 지났다, 이런거에 조급해하지 말고 천천히 푸는걸 연습해야 겠다... ㅠㅠ

class Solution {
    /**
     * 20220908 ref solved
     * 1. 파라미터를 3으로 나눈다.
     * 2. 나머지 값이 0일 경우 4로, 나머지는 그대로 마지막 자릿수부터 채운다.
     * 3. 1~2과정을 1에서 나온 몫에 대해 반복한다.
     * 4. 언제까지? 몫이 0이 될때까지!...
     * 5. 단, 3으로 나누어 떨어지면 몫-1을 해줘야 한다.
     * 6. 왜? 계산식에 의하면 3의배수가 되는 숫자에 한해서 이상한 계산이 나오게 된다.
     * 7. 3진법이므로, 3의 배수가 될때마다 자릿수가 올라가서, 반복문을 한번 더 돌게 된다.
     * 8. 그럴때 몫-1로 보정해주면 우리가 예상한대로 124 계산법과 맞게 나온다!
     */
    public String solution(int number) {
        int portion=number; //while 문 초기에 걸리지 않기 위한 초기값
        int remainder=0;
        StringBuilder answer = new StringBuilder();
        //String answer="";

        while(portion>0){
            //나머지가 0이면 4로 매핑, 이외의 경우니 1,2는 그대로 사용한다.
            remainder = number%3 == 0  ? 4 : number%3;
            answer.insert(0,remainder);

            portion = number/3;

            if(remainder==4){
                portion--;
            }
            number = portion;
        }
        return answer.toString();
    }
}

 

refs

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이참고

https://velog.io/@hyeon930/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-124-%EB%82%98%EB%9D%BC%EC%9D%98-%EC%88%AB%EC%9E%90-Java

 

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

프로그래머스 124 나라의 숫자(https://programmers.co.kr/learn/courses/30/lessons/12899최악의 경우 n이 5억이다. 따라서 하나씩 숫자를 올려가며 하는 것은 불가하다. 숫자가 1, 2, 4 세 가지만 존재하니까 n을

velog.io

 

반응형

'알고리즘' 카테고리의 다른 글

프로그래머스[12951] - JadenCase 문자열 만들기(lv2)  (0) 2022.09.10
최댓값과 최솟값(lv2)  (0) 2022.09.09
없는 숫자 더하기(lv1)  (0) 2022.09.03
음양 더하기(lv1)  (0) 2022.09.02
최소직사각형(lv1)  (0) 2022.09.01