프로그래머스/Lv. 2

[프로그래머스 코딩테스트] 다음 큰 숫자(Java)

Sigfriede 2023. 6. 21. 01:00

  문제 설명

  자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.

  • 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
  • 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
  • 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.

  예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.

  자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.

 

  제한사항

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

 

  입출력 예

n result
78 83
15 23
class Solution {
    public int solution(int n) {
        int answer = n;
        int nCount = 0;
        String nBinary = Integer.toBinaryString(n);
        for (int i = 0; i < nBinary.length(); i++) {
            if (nBinary.charAt(i) == '1') {
                nCount++;
            }
        }
        int count = 0;
        while (answer > 0) {
            answer++;
            String binary = Integer.toBinaryString(answer);
            for (int i = 0; i < binary.length(); i++) {
                if (binary.charAt(i) == '1') {
                    count++;
                }
            }
            if (count == nCount) {
                break;
            }
            count = 0;
        }
        return answer;
    }
}

  변수 answer에는 n을 할당합니다. 변수 nCount는 n을 2진수로 변경했을 때 1의 개수를 담을 것입니다. 변수 nBinary에는 Integer 클래스의 toBinaryString 메소드를 이용하여 n을 2진수로 변경한 값을 할당합니다.

  첫 번째 for문이 nBinary의 길이만큼 순회합니다. if문에서 nBinary의 i 번째 숫자가 1이라면 nCount가 증가합니다.

  변수 count를 생성합니다. 이는 n보다 큰 숫자 중에서 1의 개수를 담을 것입니다.

  while문은 answer가 0보다 큰 동안 반복합니다. 반복문을 진행시키기 위한 조건이므로 큰 의미는 없습니다. 항상 참이므로 중간에 break를 이용하여 반드시 반복문을 탈출할 수 있도록 해야합니다.

  answer가 증가합니다.

  2진수로 변경하여 1의 개수를 찾는 과정은 앞서 설명한 과정과 동일합니다.

  if문에서 count와 nCount의 값이 동일하다면 1의 개수가 같다는 뜻입니다. break를 이용하여 반복문을 빠져나오고, 1의 개수가 같은 수를 반환합니다.

  count와 nCount가 같지 않다면 count에 0을 할당하여 다음 값을 계산하여 1의 개수가 같은 수를 찾을 때까지 반복하도록 합니다.

 

  사실 코드에 중복되는 부분이 있어서 조금 아쉬운 코드이기도 하지만, 간단한 부분이어서 우선은 놔두기로 했습니다. 디테일한 수정은 나중을 기약하며….