[프로그래머스/자바] 다음 큰 숫자

솔솔·2023년 7월 1일
0
post-thumbnail


📑 문제 설명

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

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

    예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.
    자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.


🧑🏻‍💻 나의 풀이

class Solution {
    public int solution(int n) {
        int answer = 0;
        // Integer.bitCount(i): 주어진 수에서 true(=1)의 수를 반환하는 함수
        int bitCnt = Integer.bitCount(n);
        
        for(int i=n+1;i<2*n;i++) {
        	if(Integer.bitCount(i)!=bitCnt) {
        		continue;
        	} 
        	answer = i; 
            break;
        }
        
        return answer;
    }
}

주어진 수 n의 1의 갯수를 Integer.bitCount()를 이용해 bitCnt에 담는다.
반복문에서 i가 가진 1의 수가 bitCnt와 일치할 경우 i를 결과값으로 리턴한다.



🧑🏻‍💻 다른 사람의 풀이

class TryHelloWorld {
    public int nextBigNumber(int n) {
        int postPattern = n & -n, smallPattern = ((n ^ (n + postPattern)) / postPattern) >> 2;
        return n + postPattern | smallPattern;
    }
    public static void main(String[] args) {
        int n = 78;
        System.out.println(new TryHelloWorld().nextBigNumber(n));
    }
}

비트연산을 사용한 코드
postPattern, smallPattern을 나눠 하나씩 보고 비트연산을 하여 2진수로 비교해가며 코드를 해석한다
비트연산 정말 어렵다..🤯



💡학습하기 - 비트연산


AND 연산 (&) : 두 수가 둘 다 1인 경우 1로 변환
OR 연산 (|) : 두 수 중 하나만 1이면 1로 변환
XOR 연산 (^) : 두 수가 다르면 1로 변환
NOT 연산 (~) : 각 자리수를 반대로 변환



🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12911

0개의 댓글