[프로그래머스] 코딩테스트 연습 - 연습문제 Level 2 다음 큰 숫자

uoahy·2021년 9월 28일
0

Solution.java

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        StringBuilder bin = new StringBuilder('0' + Integer.toBinaryString(n));
        
        int len = bin.length();
        
        int count = (bin.charAt(bin.length() - 1) == '0') ? -1 : 0;
        int i;
        for (i = bin.length() - 2; i >= 0; i--) {
            if (bin.charAt(i) == '0') break;
            count++;
        }
        
        bin.setLength(i);
        bin.append('1');
        i++;
        while (i < len - count) {
            bin.append('0');
            i++;
        }
        while (i < len) {
            bin.append('1');
            i++;
        }
        
        answer = Integer.parseInt(bin.toString(), 2);
        
        return answer;
    }
}

제출하니 몇 개는 실패에 효율성 테스트는 전부 시간초과가 떴다.

다음에 다시 도전해봐야겠다.


Solution.java (수정)

class Solution {
    public int solution(int n) {
        int answer = n;
        
        StringBuilder bin = new StringBuilder("0");
        bin.append(Integer.toBinaryString(n));
        
        int i = bin.length();
        int b1 = 1;
        while (bin.charAt(--i) == '0') b1 *= 2;
        answer -= b1;
        b1 *= 2;
        int b2 = 1;
        while (bin.charAt(--i) == '1') {
            answer -= b1;
            answer += b2;
            b1 *= 2;
            b2 *= 2;
        }
        answer += b1;
        
        return answer;
    }
}

처음엔 다음 큰 숫자를 2진수로 먼저 만든 후 그걸 10진수로 변환시키는 방법으로 풀었었는데 그렇게하니 계속 시간초과가 났다.

그래서 2진수를 만들지 않고 규칙만 적용하여 10진수 상태에서 값만 바꿔줬더니 통과했다.

이제보니 StringBuilder도 다시 String으로 바꿔줘도 될듯하다.


String으로 바꾸니 시간초과가 난다;;; 맨 앞에 0 하나 붙이는것때문에 StringBuilder를 써야할듯하다.


다른 사람의 풀이를 보니 비트연산을 통한 풀이가 있었다. 나도 비트를 좀 써버릇해야겠다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

0개의 댓글