코딩 테스트/프로그래머스

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

sangjin98 2024. 4. 18. 10:05
반응형

문제


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

 

프로그래머스

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

programmers.co.kr

 

문제 분석


[제한사항]

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

1, 2, 4 만을 사용하는 나라에서 주어진 n 을 어떻게 나타내는 지 찾는 문제이다.

 

제한 조건이 크기 때문에 n*2 만 되도 시간 초과가 날 것이다.

 

문제 접근


우선 숫자 3개로 주어진 숫자로 만들어야 하기 때문에 주어진 숫자를 3으로 나누면 어떤 규칙이 보이지 않을까? 라고 생각하고 접근하였다.

 

그래서 10을 3으로 나누었다. ( 10 / 3 = 3 .. 1 )

그러고 보니 다음과 같은 규칙을 발견할 수 있었다. 

 

변경된 숫자 (41) = 2^(몫 - 1) 2^(나머지-1)

즉, 2의 2 승과 2의 0승의 조합으로 41 이 된다.

 

다른 예시로 20을 들어보자.

20 / 3 = 6 ... 2

처음으로 나온 나머지가 2로 첫 자리는 정해졌다. 2의 1승으로 2가된다.

 

6 / 3 = 2 .. 0 -> 1 ... 3 

다음으로 나오는 나머지 0 대신 3으로 만들고 대신 몫에서 1을 빼준다. 그럼 다음 자리는 2의 2승으로 4가 된다.

 

1 / 3 = 0 ... 1

마지막은 2의 0승으로 1이 된다.

 

합치면 142 가 된다.

 

위 규칙을 잘 활용해 코드를 작성하면 문제를 해결할 수 있다.

 

코드


import java.util.*;

class Solution {
    public String solution(int n) {
        String answer = "";

        StringBuilder sb = new StringBuilder();
    
        while(n > 0){
            int namuge = n % 3;
            n = n / 3;
            
            if(namuge == 0){
                namuge = 3;
                n--;
            }
            
            sb.insert(0, (int)Math.pow(2, namuge-1));
        }
        return sb.toString();
    }
}

 

주의

문제를 풀면서 문자열에 계속 + 하는 형식으로 결과를 내니 시간 초과가 난다.

String 에서는 + 연산을 하면 기존 객체에서 합쳐지는 것이 아닌 합쳐진 새로운 객체가 생성되는데 이 때문에 시간 초과가 난 것으로 예상된다.

 

따라서 문제를 풀기 위해 StringBuilder 를 사용하였다.

반응형