https://school.programmers.co.kr/learn/courses/30/lessons/12911
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
class Solution {
public int solution(int n) {
/*
1. 조건에서 규칙을 찾아보자.
n=1 : 2
n=2 : 4
n=4 : 8
n=8 : 16
n=3 : 5
n=5 : 6
n=6 : 9
n=9 : 10
n=10 : 12
n=7 : 11
-> 규칙 모르겠다.
2. 그냥 구현으로 확인하는 방법
1) n을 2진수로 바꿔 1 개수를 센다
2) n에서 1씩 증가하면서 2진수로 바꿔 1개수를 센다.
3) 가장 먼저 1 개수가 같아지는 수가 정답.
*/
//2진수로 바꾸기
String nBinaryString = Integer.toBinaryString(n);
//1의 개수 세기
int nOneCount = countOne(nBinaryString);
//n 다음수의 1의개수가 n의 1의개수와 같아질때까지
int nNextOneCount = 0;
String nNextBinaryString = "";
while(nOneCount != nNextOneCount){
//1씩 증가하기
n++;
//n 다음수 이진수로 변경하기
nNextBinaryString = Integer.toBinaryString(n);
//n 다음수 1의 개수 세기
nNextOneCount = countOne(nNextBinaryString);
}
return Integer.parseInt(nNextBinaryString, 2);
}
public int countOne(String s){
int count = 0;
for(int i=0; i<s.length(); i++){
if(s.charAt(i)=='1') count++;
}
return count;
}
}
먼저 규칙성을 찾아보려 했으나 보이지 않았다.
그래서 구현을 통해 해결하는 방법을 고민해보니 훨씬 나은 방법 같았다.
이번 문제에서는 한단계씩 잘게 나눠서 푼 점이 매우 좋았던 것 같다.
자바의 라이브러리를 사용한 점은 조금 아쉬울 수 있다.
시간은 20분 소요되었다.
다른분들의 풀이
public int nextBigNumber(int n){
int a = Integer.bitCount(n);
while (Integer.bitCount(++n) != a) {}
return n;
}
Integer.bitCount() 메소드는 지정된 int 값의 2의 보수 이진 표현에서 1비트 수를 반환한다.
이 라이브러리를 사용하면 아주 짧고 쉽게 풀 수 있었다.
'알고리즘 > 문제' 카테고리의 다른 글
| [프로그래머스] Lv2 카펫 / JAVA (0) | 2023.02.27 |
|---|---|
| [프로그래머스] Lv2 영어 끝말잇기 / JAVA (0) | 2023.02.26 |
| [프로그래머스] Lv2 피보나치 수 / JAVA (0) | 2023.02.25 |
| [프로그래머스] Lv2 숫자의 표현 / JAVA (1) | 2023.02.23 |
| [프로그래머스] lv2 이진변환 반복하기 / JAVA (0) | 2023.02.22 |
