다음 큰 숫자

문제정의


어떠한 자연수 n이 주어질 때 다음으로 큰 숫자를 찾으면 된다. 다음으로 큰 숫자에 대한 조건은 3가지를 만족해야 한다. 1. n보다 커야 한다. 2. n과 해당 수를 이진수로 바꿨을 때, 1의 개수가 같아야 한다. 3. 1과 2를 동시에 만족하는 가장 작은 수여야 한다.

문제풀이


전체 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package level2;

public class NextBigNum {

//프로그래머스 문제풀이 level2 다음 큰 숫자

public static void main(String[] args) {
int n = 78;
int answer = n;
int one = 0, t_one = 0;
String binary = Integer.toBinaryString(n);
char[] arr = binary.toCharArray();
for(char c : arr)
{
if(c == '1')
one++;
}
while(one != t_one)
{
answer++;
t_one = 0;
String temp = Integer.toBinaryString(answer);
char[] t_arr = temp.toCharArray();
for(char c : t_arr)
{
if(c == '1')
t_one++;
}
}
System.out.println(answer);
}

}

풀이는 간단하다 n에서 1씩 늘려가며 1의 개수를 비교하며 같아질 때 답을 출력하는 것이다.

여기서 시간복잡도를 계산하기가 굉장히 애매한데 1이 같아지는 경우가 언제인지 잘 모르겠기 때문이다. 이 부분에서는 더 공부가 필요하다.

테스트



java에 bitCount로 1을 세주는 함수가 있었다. 자바에는 무궁무진한 메소드의 세계가 있는 것 같다.