1. 다음 큰 숫자(이진문제)
- 프로그래머스 Level 2 정답률 70%넘는 기본 문제
- 문제 설명
1) 78 -> ( 이진변환 ) 1001110
2) 1의 갯수가 같으면서 이 다음으로 큰 자연수의 최소 값을 구하는 문제
3) 83 -> ( 이진변환 ) 1010011
4) 1의 갯수가 같으면서 다음으로 큰 자연수 중 가장 최소 값임.
2. 처음 풀이 접근
- 그냥 간단하게 자연수를 이진 변환 해주는 Intger.toBinaryString()을 사용
public class Solution8 {
public static int solution(int n) {
String nB = Integer.toBinaryString(n);
int nBCount = 0;
int plus = 1;
for(int i = 0 ; i < nB.length(); i++){
if(nB.charAt(i)=='1') nBCount++;
}
while(true){
int plusCount = 0 ;
String nBPlus = Integer.toBinaryString(n + plus);
for(int j = 0 ; j < nBPlus.length() ; j ++){
if(nBPlus.charAt(j)=='1') plusCount++;
}
if(nBCount == plusCount) return n + plus;
plus++;
}
}
}
- 자연수 N -> 이진수로 변환 -> 1의 갯수가 같을 때 return
3. 수정 풀이
- 굳이 이진수로 변환하지 않고 Integer.bitCount()로 자연수의 이진수 1의 갯수를 셀 수 있음..!!
- 그냥 변환 하는 부분을 Count의 갯수 비교로 바꿔주면 될듯.
- 상위 풀이 중 비트 연산자를 보았는데, 오랜만에 보니 헷갈려서 다시 정리를 간단하게 해봄.
&, |, ^
- & : 피연산자 둘다 1이여야 1의 결과를 얻을 수 있음 ( AND )
- | : 피연산자 둘중 하나만 1이여도 1의 결과를 얻을 수 있음 ( OR )
- ^ : 피연산자 둘중 하나만 1이여야 1의 결과를 얻을 수 있음 둘다 1이면 0 ( XOR )
비트연산
>>
: 오른쪽으로 비트연산
<<
: 왼쪽으로 비트연산 ( 빈자리는 0으로 채워짐 )
int n = 2 << 2