문제 설명
자연수 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 이하의 자연수 입니다.
자연수 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 이하의 자연수 입니다.
이건 제법 쉽게 해결했다 :D
우선, 받은 수 n을 이진수로 변환하여 1의 갯수를 먼저 구한다.
n을 이진수로 변환하면서 동시에 String으로 저장하고, 여기에서 replace를 통해 전체 길이에서 0의 길이를 빼면 1이 몇개가 있는지 확인이 가능하다.
이렇게 해당하는 수를 찾은 뒤, 다음 테스트할 번호도 똑같은 과정을 거친 뒤에 전과 비교하여 1과 2를 동시에 만족하는지를 while문으로 체크하고, 해당하는 수가 나오면 루프를 정지한다.
class Solution {
public int solution(int n) {
int answer = 0;
// 1. n을 이진수로 변환하여 1의 갯수 구하기
// 2. n이후의 자연수를 이진수로 변환
// 3. n변환 후 1의 갯수가 같은지 확인
String bNum = Integer.toBinaryString(n);
int CountOne = bNum.length() - bNum.replace("1", "").length();
boolean ck = true;
int aNum = n + 1;
while(ck){
//테스트할 수 이진 변환
String testNum = Integer.toBinaryString(aNum);
int CountNum = testNum.length() - testNum.replace("1", "").length();
if(CountNum == CountOne){
answer = aNum;
ck = false;
}else{
aNum++;
}
};
return answer;
}
}
'Algorithm' 카테고리의 다른 글
[007] 점프와 순간 이동 (0) | 2024.02.16 |
---|---|
[006] 영어 끝말잇기 (0) | 2024.02.16 |
[005] 영어 끝말잇기 (풀이중) (0) | 2024.02.15 |
[002] 짝지어 제거하기 (1) | 2024.02.13 |
[001] 피보나치 수 구하기 (0) | 2024.02.13 |