✔ 다음 큰 숫자
문제 분석하기
n을 2진수로 변환하여 1의 갯수를 찾은 후,
n + 1 부터 1000000까지를 반복하면서 2진수로 변환했을 때 1의 갯수가 같은 자연수를 찾아 반환
손으로 풀어보기
- n을 2진수로 변환하여 1의 갯수 세기
- n + 1 부터 1000000까지를 반복하면서 2진수로 변환했을 때 1의 갯수가 같은 자연수를 찾아 반환
슈도코드 작성하기
n(자연수)
answer(조건을 만족하는 수 중 가장 작은 수)
one(n을 2진수로 변환했을 때 1의 개수) = 이진수 변환 및 1의 개수 세기 함수(n)
for(i -> n + 1부터 1000000까지) {
if(이진수 변환 및 1의 개수 세기 함수(i)가 one과 동일하다면) {
answer = i;
break;
}
}
answer 반환
이진수 변환 및 1의 개수 세기 함수 {
s(이진수로 변환한 문자열)
count(1의 개수)
for(i -> s의 길이만큼) {
if(s.charAt(i)가 1이라면)
count 증가
}
count 반환
}
코드 구현하기
/**
* 12911) 다음_큰_숫자
*/
public class L009_12911 {
// n(자연수)
public int solution(int n) {
// answer(조건을 만족하는 수 중 가장 작은 수)
int answer = 0;
// one(n을 2진수로 변환했을 때 1의 개수)
int one = convertAndCount(n);
for (int i = n + 1; i < 1000000; i++) {
// 이진수 변환 및 1의 개수 세기 함수(i)가 one과 동일하다면
if (convertAndCount(i) == one) {
// answer을 i로 갱신한 후 종료
answer = i;
break;
}
}
// answer 반환
return answer;
}
// 이진수 변환 및 1의 개수 세기 함수
private int convertAndCount(int n) {
// s(이진수로 변환한 문자열)
String s = Integer.toBinaryString(n);
// count(1의 개수)
int count = 0;
for (int i = 0; i < s.length(); i++) {
// s.charAt(i)가 1이라면
if (s.charAt(i) == '1')
// count 증가
count++;
}
// count 반환
return count;
}
// 테스트 케이스
public static void main(String[] args) {
L009_12911 solution = new L009_12911();
int n = 78;
int result = solution.solution(n);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[12914] 멀리 뛰기 (0) | 2024.01.03 |
---|---|
[12913] 땅따먹기 (0) | 2024.01.03 |
[250137] 붕대 감기 (0) | 2024.01.02 |
[250125] 이웃한 칸 (0) | 2024.01.02 |
[250121] 데이터 분석 (0) | 2024.01.02 |