반응형
- 첫 풀이 및 정답풀이
이 문제를 읽은 후, 바로 Integer.toBinaryString() 메서드를 활용해야겠다는 생각이 들었고 바로 정답 처리를 받을 수 있었다. 로직은 간단하다.
1. 입력된 n을 2진수로 변환한다.
2. 변환된 2진수의 비트가 1인 개수를 카운팅한다.
3. n+1부터 위 과정을 반복해 앞서 구한 개수와 일치하는 수를 찾는다.
class Solution {
public int solution(int n) {
int answer = 0;
// 1. n을 2진수 변환.
String str = Integer.toBinaryString(n);
// 2. n의 1인 비트의 수를 저장하는 변수.
int cnt =0;
// 3. 1인 비트의 수를 카운팅.
for(int i = 0;i<str.length();i++){
if(str.charAt(i) == '1') cnt++;
}
// 4. n+1부터 반복.
for(int i =n+1;i<1000000;i++){
// 5. 위 과정을 반복.
String temp = Integer.toBinaryString(i);
int temp_cnt = 0;
for(int j =0;j<temp.length();j++){
if(temp.charAt(j) == '1') temp_cnt++;
}
// 6. 1인 비트의 수가 일치하면 해당 수를 담아 반복문 종료.
if(temp_cnt == cnt) {
answer = i;
break;
}
}
return answer;
}
}
더 나은 풀이가 없을까 하고 찾아보았더니 Integer.bitCount()라는 메소드가 존재했다. 이 메소드는 입력된 정수를 2진수로 변환한 뒤, 2진수에 포함된 1을 카운팅 해주는 메소드라고 한다. 이를 활용한 풀이는 아래이다.
class Solution {
public int solution(int n) {
int answer = 0;
// 1. 입력받은 n의 1 개수를 저장.
int n_cnt = Integer.bitCount(n);
// 2. 증가하는 n의 1 개수를 저장 할 변수.
int b_cnt = 0;
// 3. 무한반복.
while(true){
// 4. n을 증가.
n++;
// 5. 증가된 n의 1 개수를 저장.
b_cnt = Integer.bitCount(n);
// 6. 일치하면, answer에 n을 담고 반복문을 빠져나온다.
if(n_cnt == b_cnt){
answer = n;
break;
}
}
return answer;
}
}
반응형