본문 바로가기
프로그래머스/JAVA

[level 2] 다음 큰 숫자

by AsCE_hyunseung 2018. 9. 10.

Number.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Number {
    public int solution(int i) {
        //1. 78부터 큰 자연수를 이진수로 변환함 (루프)
        for(int index=i+1;;index++)
        {//2. 두 수의 1의 개수를 비교
            if(Integer.bitCount(i) == Integer.bitCount(index))
            {
                //3. 1의 개수가 맞으면 큰 수 반환 (자연수)
                return index;
            }
            //3.1 1의 개수가 맞지 않으면 이번으로 회귀
        }
    }
}
dcs


NumberTest.java


1
2
3
4
5
6
7
8
9
10
11
12
13
import org.junit.Test;
 
import static org.junit.Assert.*;
 
 
public class NumberTest {
    Number number = new Number();
    @Test
    public void 테스트_결과() {
        assertEquals(83, number.solution(78));
        assertEquals(23, number.solution(15));
    }
}
cs


- 문제 설명

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


조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.

조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.

조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.

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


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


- 제한 사항

n은 1,000,000 이하의 자연수 입니다.


처음 문제를 풀때 자연수를 2진수를 바꾼 뒤에 1의 개수를 직접 세는 방법으로 풀었는데 다른 사람들의 풀이를 보니 bitcount()라는 2진수로 바꿔주고 1의 개수를 세주는 메소드가 있어서 축약했다.


처음 TDD방법론으로 해결한 문제라서 자주 볼 것 같은 코드와 문제이다.

'프로그래머스 > JAVA' 카테고리의 다른 글

[level 2] N개의 최소공배수  (0) 2018.09.13
[level 2] 행렬의 곱셈  (0) 2018.09.11
[level 1] 핸드폰 번호 가리기  (0) 2018.09.06
[level 1] 정수 제곱근 판별  (0) 2018.09.04
[level 1] 평균 구하기  (0) 2018.09.02