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

2023. 7. 11. 20:14·Algorithms(CT)/Programmers

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

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

1. 124 나라에는 자연수만 존재합니다.

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

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

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

 

제한사항

- n은 50,000,000 이하의 자연수입니다.


💡 아이디어

자릿수와 해당 자릿수의 개수를 보면서 규칙을 찾는다.

자릿수가 1인 수들은 모두 3개로 3^1개

자릿수가 2인 수들은 모두 9개로 3^2개

... 따라서 자릿수가 k인 수들은 모두 3^k개라는 것을 알 수 있다.

 

n의 자릿수를 구하고, 해당 자릿수의 몇 번째 숫자인지 구한다.

 

그리고 모든 수를 표현할 때 1, 2, 4만을 가지고 표현하는 것은 3진법에서 0, 1, 2만을 사용하는 것과 비슷하다.

n의 자릿수를 구하고 몇 번째 숫자인지 구했다면 몇 번째 숫자인지 나타내는 숫자를 3진법으로 바꿔 

0=>1, 1=>2, 2=>4로 변환해 answer을 구한다.

 

📗 풀이과정

1. n의 자릿수와 해당 자릿수에서 몇 번째 숫자인지 구합니다.

int digit=1; //자릿수
int cnt=0; //digit 자릿수에서 몇 번째 숫자인지

while(true){
	if(n<=Math.pow(3,digit)){//다음자릿수를 넘어가지 않는 경우
    	cnt=n-cnt;break;//몇번째 숫자인지 저장
        
    }else{//다음자릿수로 넘어가는 경우
    	n-=Math.pow(3,digit);
        digit++;//자릿수 하나 늘린다
    }
}

 

2. 해당 숫자가 몇 번째 인지 구했다면, 숫자 0을 사용하지 않기 때문에 3진법으로 바꿀 때에도 cnt-1을 3진법으로 바꿔준다. (몇 번째 숫자인지는 1번부터 시작하기 때문에 0번부터 시작하는 걸로 만들어주는 것.)

//몇 번째 숫자인지 구했다면 -1을 해서 3진법으로 바꿈
String base3 = Integer.toString(cnt-1,3);

 

3. 자릿수를 모두 채우기 위해 숫자의 앞자리를 모두 0으로 채워줍니다.

while(base3.length()!=digit) base3="0"+base3;//자릿수 채움

 

4. 3진법으로 바꾼 숫자를 0:1, 1:2, 2:4로 바꿔주고, 구한 answer을 return 합니다.

for(int i=0;i<base3.length();i++){// 0:1, 1:2, 2:4 대입
	if(base3.charAt(i)=='0') answer+="1";
    else if(base3.charAt(i)=='1') answer+="2";
    else answer+="4";
}

전체 코드

class Solution {
    public String solution(int n) {
        String answer = "";
        
        int digit=1;//자릿수
        int cnt=0;//digit 자릿수에서 몇번째 숫자인지
        
        while(true){
            if(n<=Math.pow(3,digit)){
                cnt=n-cnt;break;
            }else{
                n-=Math.pow(3,digit);
                digit++;
            }
        }
        //System.out.println(digit+" "+cnt);
        
        String base3=Integer.toString(cnt-1,3);//몇번째 숫자인지 구했다면 -1을 해서 3진법으로 바꿈.
        while(base3.length()!=digit) base3="0"+base3;//자릿수를 채우기 위해 0 더해줌.
        
        //System.out.println(base3);
        
        for(int i=0;i<base3.length();i++){// 0:1, 1:2, 2:4 대입
            if(base3.charAt(i)=='0') answer+="1";
            else if(base3.charAt(i)=='1') answer+="2";
            else answer+="4";
        }
        
        return answer;
    }
}

'Algorithms(CT) > Programmers' 카테고리의 다른 글

[프로그래머스] Lv.2 두 큐 합 같게 만들기  (0) 2023.07.13
[프로그래머스] Lv.2 연속된 부분 수열의 합 (Java)  (0) 2023.07.12
[프로그래머스] Lv.2 삼각 달팽이 (Java)  (0) 2023.07.10
[프로그래머스] Lv.2 택배상자  (0) 2023.07.06
[프로그래머스] Lv.2 쿼드 압축 후 개수 세기  (0) 2023.07.06
'Algorithms(CT)/Programmers' 카테고리의 다른 글
  • [프로그래머스] Lv.2 두 큐 합 같게 만들기
  • [프로그래머스] Lv.2 연속된 부분 수열의 합 (Java)
  • [프로그래머스] Lv.2 삼각 달팽이 (Java)
  • [프로그래머스] Lv.2 택배상자
gwee_99
gwee_99
bE bETTER!
  • gwee_99
    얼렁이와 뚱땅이
    gwee_99
  • 전체
    오늘
    어제
    • ====Category====
      • Algorithms(CT)
        • Programmers
        • Baekjoon
        • Goorm
      • Web
        • Error 해결
      • BackEnd
        • Spring
        • JPA
      • FrontEnd
        • HTML.CSS
        • JavaScript
      • Language
        • Java
      • Cloud
      • CSTS
      • Books
        • IT 5분 잡학사전
      • 일상
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    lv.4
    LV.3
    Til
    호텔 대실
    자바
    백준
    IT 잡학사전
    그리디
    스택
    구름톤 챌린지
    개발자북클럽
    HTML
    제대로 파는 자바스크립트
    LV.2
    존안님
    BOJ
    따라하며 배우는 html css
    코딩테스트
    구름
    lv2
    인프런
    java
    노마드코더
    DFS
    프로그래머스
    DP
    Greedy
    Lv.1
    BFS
    IT 5분 잡학사전
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gwee_99
[프로그래머스] Lv.2 124 나라의 숫자 (Java)
상단으로

티스토리툴바