본문 바로가기
코딩 테스트/[JAVA] programmers 코딩 테스트 연습

[Programmers/JAVA] 다음 큰 숫자 / 프로그래머스 코딩 테스트 연습

by M개발자 2021. 12. 27.
반응형

다음 큰 숫자


문제 설명

 

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

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

예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.

자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.


예시

 

n result
78 83
15 23

코드 해석 및 전체 코드

 

1.이진수로 변환하는 과정에서 1의 개수를 구하는 메소드 구현

2. while문 반복으로 n보다 큰 수 중에서 1의 개수와 같은 숫자 반환

 

이 문제의 핵심은 이진수로 변환해서 1을 구하는 과정이다.

binaryOne() 메소드에서 n을 2로 나누었을 때의 나머지가 1이면 반환값에 1을 더한 뒤 n을 2로 나눈다.

 

그리고 다시 메인에서 n의 1의 개수를 저장하고,

n보다 큰 수에서 1의 개수가 같은지 찾는 while문을 반복한다.

 

 

class Solution {
    public int solution(int n) {
        int answer = 0;
        int originOne = binaryOne(n);// n의 이진수 1의 개수
        //System.out.println(one);
        int num = n + 1; // n보다 1 큰 수
        
        while(true){
            int one = binaryOne(num); // n보다 큰 수
            if(one == originOne) return num; // n보다 큰 수의 이진 수 1의 개수와 n의 이진수 1의 개수가 같은지 비교
            num++; // num + 1
        }
       
    }
    private int binaryOne(int n){
        int ret = 1; // 마지막 나누었을 때 나머지가 1이라 미리 더함
        
        // 1이 아닐 때까지 반복
        while(n != 1){
            int b = n % 2; // n을 2로 나누었을 때의 나머지 (이진수 구하기)
            if(b == 1) ret++; // b가 1일 때 반환값에 1 더함
            n /= 2; // 다음 이진수 구하기 위해 2로 나눔
        }
        return ret;
    }
}

github

programmers

 

반응형

댓글