본문 바로가기

코딩테스트/programmers

다음 큰 숫자

https://school.programmers.co.kr/learn/courses/30/lessons/12911?language=java 

 

프로그래머스

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

programmers.co.kr

 

n보다 큰 수 중 2진수의 1의 갯수가 n의 2진수의 1의 갯수와 동일한 수 중 가장 작은 수를 찾으면 된다.

 

처음엔 Integer.toBinaryString 으로 2진수를 구하고, replaceAll로 0을 모두 제거한 뒤의 문자열 갯수를 비교하는 방식을 썼다.

 

public int useReplace(int n) {
    int answer = n;
    int cnt = countOne(Integer.toBinaryString(n));

    while (n < Integer.MAX_VALUE) {
        int check = countOne(Integer.toBinaryString(++n));
        if (cnt == check) {
            answer = n;
            break;
        }
    }

    return answer;
}

int countOne(String str) {
    return str.replaceAll("0", "").length();
}

 

정확성 테스트에는 문제가 없었으나, 효율성 테스트를 통과하지 못했다.

 

다음은 char 로 1의 갯수를 체크했다.

 

    int countOne(String str) {
        char[] charr = str.toCharArray();
        int cnt = 0;
        for (char c : charr) {
            if (c == '1') cnt++;
        }
        return cnt;
    }

 

정확성과 효율성 모두 통과했지만..

 

Integer.bitCount 라는 메서드가 있어 훨씬 수월하게 처리가 가능하다는걸 알았다..

public int useBitCount(int n) {
    int answer = n;

    int cnt = Integer.bitCount(n);
    while (n < Integer.MAX_VALUE) {
        int check = Integer.bitCount(++n);
        if (cnt == check) {
            answer = n;
            break;
        }
    }

    return answer;
}

 

그런데 이마저도 비트 연산을 통해 더 단축할 수 있다더라... 만 비트연산은 따로 테스트해보지 않음.

'코딩테스트 > programmers' 카테고리의 다른 글

짝지어 제거하기  (0) 2023.09.18
피보나치 수  (0) 2023.09.16
프로세스  (0) 2023.09.13
리코쳇 로봇  (0) 2023.09.13
하노이의 탑  (0) 2023.09.12