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

2022. 3. 12. 12:02·프로그래머스/Level 2

문제

 

 

문제풀이

public String solution(int n) {     //124나라의 숫자
    String answer = "";
    while(n>0){
        if(n%3 == 1){               //나머지가 1일때,
            n = n/3;                //n값을 3으로 나눠주고
            answer = "1" + answer;  //answer에 1을 더함
        }else if(n%3 == 2){         //나머지가 2일때,
            n = n/3;
            answer = "2" + answer;
        }else if(n%3 == 0){         //나머지가 0일때,
            answer = "4" + answer;  //answer에 4를 더하고
            n = n/3;                //n값을 3으로 나눠준 뒤
            n--;                    //n값에 1을 뺀다.
        }
    }
    return answer;
}

우선 이 문제는 딱봐도 3진법으로 풀어라는 문제여서 3진법으로 풀려고 했는데 다른 부분은 문제가 없었는데

나눴을 때, 나머지가 0이 되는 즉, 3의 배수가 되는 부분이 문제였다.

이것이 삼진법에서는 0으로 표현을 하지만 이 문제에서는 그것을 4로 표현을 했기 때문에 이 부분이 조금 까다로웠다.

 

예를 들어,

십진법 6의 경우 삼진법으로 고치면 20이 되지만 124나라에서는 14가 된다.  

십진법 12의 경우 삼진법으로 고치면 110이 되지만 124나라에서는 44가 된다.

 

그래서 규칙을 봤더니 20에서 0->4로 바꾸고 앞자리2를 1낮추면 14가 되고

110에서 0->4로 바꾸고 앞자리1을 1낮추면 0이되서 104가 되는데 여기서 다시 0->4로 바꾸고 앞자리 1을 낮추면 044

즉, 44가 되는 것을 발견할 수 있었다.

124나라에서 1은1 2는2이기 때문에 앞자리 1을 낮추는 것은 n에서 1을 뺀다는 의미와 같으므로

n을 3으로 나눈 나머지가 0일때는 나머지를 4라고 치고 answer에 4를 더하고 n값을 3으로 나눠준 뒤 n에 1을 빼면 된다.

 

근데 나는 이렇게 복잡하게 풀었는데 다른 푸신분들 풀이중에 엄청난 것이 있었다...

public String solution(int n) {
      String[] num = {"4","1","2"};
      String answer = "";

      while(n > 0){
          answer = num[n % 3] + answer;
          n = (n - 1) / 3;
      }
      return answer;
  }

바로 이것이다...

정말 n = (n - 1) / 3; 이 부분은 상상치도 못한 부분이었다!

이 부분에 대한 설명은

1,2,4 숫자 체계에서 3씩 나누면 한 칸씩 당겨진다. 하지만 문제가 발생하는데

이에 대해 설명을 돕기위해 1, 2, 4를 1, 2, 3이라고 가정한다.

만약, 133일경우 한 칸씩 당기면 13.3이 되는데 이때 0.1은 10진수로 1/3이 된다. 그래서 13.3의 0.3이 1이되어서 몫에 영향을 주게 된다. 그래서 나누기전에 -1을 해주면 소수점 값이 0.3일때 몫에 영향을 줄 일이 없게 되고 111을 당길경우 1을빼면 33이되고 이를 3으로 나누어서 당겨주면 3.3이되는데 0.3은 1이되므로 3 + 1해서 11이되어서 정상적으로 당겨지게 된다. 당기면서 3모듈러연산하면 1의자리수 알 수있으니 계속 당기면서 1의자리 추출해준것이다.

라고 설명이 되어져 있는데 정말 대단한 것 같다...

이런 발상은 나는 언제쯤 할 수 있을까...

저작자표시 비영리 (새창열림)

'프로그래머스 > Level 2' 카테고리의 다른 글

[프로그래머스][Level2][Java] 주식가격  (0) 2022.03.21
[프로그래머스][Level2][Java] 프린터  (0) 2022.03.18
[프로그래머스][Level2][Java] 다음 큰 숫자  (0) 2022.03.11
[프로그래머스][Level2][Java] 땅따먹기  (0) 2022.03.10
[프로그래머스][Level2][Java] 숫자의 표현  (0) 2022.03.08
'프로그래머스/Level 2' 카테고리의 다른 글
  • [프로그래머스][Level2][Java] 주식가격
  • [프로그래머스][Level2][Java] 프린터
  • [프로그래머스][Level2][Java] 다음 큰 숫자
  • [프로그래머스][Level2][Java] 땅따먹기
BvrPark
BvrPark
코드 퍼즐과 개발 일상
  • BvrPark
    비버의 개발 일지
    BvrPark
  • 전체
    오늘
    어제
    • 분류 전체보기 (121)
      • JAVA (7)
        • 메서드 외울 것 (2)
      • 프로그래머스 (56)
        • 총 풀이 코드(깃허브) (1)
        • Level 1 (22)
        • Level 2 (33)
      • 백준 알고리즘(단계 별) (16)
        • 총 풀이 코드(깃허브) (1)
        • 1. 입출력과 사칙연산 (2)
        • 2. if 문 (2)
        • 3. for문 (1)
        • 4. while문 (2)
        • 5. 1차원 배열 (3)
        • 6. 함수 (1)
        • 7. 문자열 (1)
        • 8. 기본수학 1 (3)
      • 백준 알고리즘(solved.ac) (9)
        • 총 풀이 코드(깃허브) (1)
        • class2 (8)
      • LeetCode 문제 풀이 (4)
        • 총 풀이 코드(깃허브) (1)
        • Easy (3)
      • 코드업 알고리즘 (7)
      • git과 github사용법 (4)
      • html, css, javaScript (2)
      • 프로젝트 (11)
        • 순수 Java 프로젝트 (2)
        • 쇼핑몰 프로젝트 (2)
        • 게시판 프로젝트 (5)
        • 근태관리 프로젝트 (2)
      • 커피타임 (2)
        • 2023년 (2)
        • 2024년 (0)
  • 블로그 메뉴

    • 링크

      • 포트폴리오
      • 깃허브
    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • Designed By정상우
    BvrPark
    [프로그래머스][Level2][Java] 124 나라의 숫자
    상단으로

    티스토리툴바