본문 바로가기

Programmers/Level2

다음 큰 숫자

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
35
class Solution {
    static int oneCnt = 0;
    public static void setLength(int num) {
        while (num != 0) {
            // 1 갯수 카운트
            if (num % 2 != 0)
                oneCnt++;
            num /= 2;
        }
    }
    
    public static boolean getNext(int num) {
        boolean flag = false;
        int cnt = 0;
        while (num != 0) {
            // 1 갯수 카운트
            if (num % 2 != 0)
                cnt++;
            if (cnt > oneCnt)
                return flag;
            num /= 2;
        }
        if (oneCnt == cnt)
            flag = true;
        return flag;
    }
    
    public int solution(int n) {
        int answer = 0;
        setLength(n++);
        while (!getNext(n++));
        answer = n - 1;
        return answer;
    }
}
cs

1의 갯수가 초과될 때 바로 종료하도록 설정하지 않으면 효율성에서 걸리게 된다.

또한 이진수 1의 개수를 구하는 함수로 Integer.bitCount 가 있으니 기억하자.

 

시간 초과가 났던 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;
 
public class test {
    // 진수 변환기
    public static int gesetLength(int num) {
        StringBuilder sb = new StringBuilder();
        while (num != 0) {
            sb.append(num % 2);
            num /= 2;
        }
        return sb.reverse().toString().replaceAll("0""").length();
    }
 
    public static void main(String[] args) {
        int n = 78;
        int answer = 0;
        int len = Integer.toBinaryString(n++).replaceAll("0""").length();
        while (len != Integer.toBinaryString(n++).replaceAll("0""").length());
        answer = n - 1;
        System.out.println(answer);
    }
}
cs

전체를 모두 구한 다음에 비교를 하게 되면 시간 초과가 된다.

'Programmers > Level2' 카테고리의 다른 글

방문 길이  (0) 2021.08.02
최솟값 만들기  (0) 2021.08.02
[3차] n진수 게임  (0) 2021.07.31
최댓값과 최솟값  (0) 2021.07.31
이진 변환 반복하기  (0) 2021.07.31