ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 5단계] 알고리즘 41. 124 나라의 숫자
    24년 11월 이전/레거시-알고리즘(3) 2018. 5. 24. 13:11
    반응형

    문제 출처는 프로그래머스 알고리즘 연습 에서 볼 수 있습니다!(https://programmers.co.kr/learn/challenges)


    알고리즘 41. 124 나라의 숫자


    1,2,4 세 개의 숫자만 쓰는 124나라가 있습니다. 124나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

        • 10진법의 1 → 1
        • 10진법의 2 → 2
        • 10진법의 3 → 4
        • 10진법의 4 → 11
        • 10진법의 5 → 12
        • 10진법의 6 → 14
        • 10진법의 7 → 21

    10진법의 수 N이 입력될 때, 124나라에서 쓰는 숫자로 변환하여 반환해주는 change124 함수를 완성해 보세요. 예를 들어 N = 10이면 “41”를 반환해주면 됩니다. 리턴 타입은 문자열입니다.

    class OneTwoFour {
        public String change124(int n) {
            String answer = "0";

            return answer;
        }

        // 아래는 테스트로 출력해 보기 위한 코드입니다.
        public static void main(String[] args) {
            OneTwoFour oneTwoFour = new OneTwoFour();
            System.out.println(oneTwoFour.change124(10));
        }
    }


    풀이:


    이 문제는 생각보다 난해했다. 처음에는 3진수로 바꾸어서 또 바꿔주면 되겠다 싶었는데... 미묘하게 숫자가 맞지 않았다.  이 문제의 핵심은 3진수로 만들되 3으로 나누어 떨어졌을 때 몫을 1을 빼주어야 한다는 것이다. 나의 알고리즘은 다음과 같다.


    1. n을 3으로 나눈다.
    2. 몫은 n에 나머지는 리스트 첫 자리에 저장한다. -> 끝자리부터 구하는 것을 의미한다.
      1. 만약 나머지가 0이라면 몫에서 1을 뺴주어야 한다.
    3. 얻은 리스트를 문자열로 바꾼다.
      1. 다만 리스트에서 0 일때는 "4"로 나머지는 그 숫자에 해당하는 문자열로 바꿔준다.


    다음은 나의 코드이다. 


    public String change124(int n) {
    String answer;
    List<Integer> list = new ArrayList<>();
    //끝자리부터 구하는 것이기 때문에 원소를 추가해야 할 때는 앞에서 추가해야 한다.
    while(n > 0){
    int a = n % 3;
    n /= 3;
    //3으로 나누어 떨어질 때는 몫에서 1을 뺴주어야 한다.
    if (a == 0){
    n-=1;
    }
    list.add(0, a);
    }
    //이제 얻은 리스트를 문자열로 바꾼다. 다만 0일 때는 4로 바꿔주어야 한다.
    answer = list.stream()
    .map(i -> (i == 0) ? "4" : i.toString())
    .reduce("", (a,b) -> a+b);
    return answer;
    }


    막상 코드를 보면 어렵지 않다. 다만 몫에서 1을 빼주는 것을 생각하기가 힘들었다. 부끄럽게도 이 문제를 풀지 못하고 다른 사람의 코드와 풀이를 보고 내 입맛에 맞춰 바꾼 코드이다. 5단계 들어서 거의 내 힘으로 풀기가 버거워지고 있다. 점점... 아무튼 5단계 역시 클리어! 이제 6단계 문제를 풀어보자!



    728x90
Designed by Tistory.