Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 프로그래머스
- 코테공부
- 자료구조
- 자바스크립트
- 99클럽
- 개발자취업
- 티스토리챌린지
- 운영체제
- 코드트리
- 1일1코테
- 오블완
- 파이썬
- 연결 리스트
- 플로이드-워셜
- 데이터베이스
- 프로그래밍 언어
- 항해99
- C
- 개발자루틴
- 인접 행렬
- 코딩테스트사이트추천
- 코딩테스트준비
- 알고리즘
- 웹
- Java
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 코딩테스트
- til
- 갭체크
- 자바
Archives
- Today
- Total
와드의 블로그
다음 큰 숫자 본문
문제
자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같은 조건을 만족합니다.
- n의 다음 큰 숫자는 n보다 큰 자연수입니다.
- n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
- n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수입니다.
- 입력: 자연수 n (1 ≤ n ≤ 1,000,000)
- 출력: n의 다음 큰 숫자
링크: https://school.programmers.co.kr/learn/courses/30/lessons/12911
풀이 1: 2진수 문자열 변환을 이용한 직관적 탐색
작성해주신 코드와 같이, 숫자를 2진수 문자열로 변환하여 '1'의 개수를 직접 세는 방법입니다.
- 1의 개수 카운팅: Integer.toBinaryString()을 이용해 주어진 숫자 n을 2진수 형태의 문자열로 변환합니다. toCharArray()로 문자 배열을 순회하며 '1'의 개수(cnt)를 셉니다.
- 다음 숫자 탐색: 정답 후보인 ans를 n + 1부터 시작하여 1씩 증가시킵니다.
- 조건 비교: 각 ans마다 동일하게 2진수 문자열로 변환하여 '1'의 개수(cnt2)를 세고, 원본 n의 1의 개수(cnt)와 일치하는 순간 반복문을 종료(break)하고 반환합니다.
코드 1
class Solution {
public int solution(int n) {
int cnt = 0;
// n의 2진수 내 1의 개수 카운트
for (char c : Integer.toBinaryString(n).toCharArray()) {
if (c == '1') {
cnt++;
}
}
int ans = n + 1;
while (true) {
int cnt2 = 0;
// ans의 2진수 내 1의 개수 카운트
for (char c : Integer.toBinaryString(ans).toCharArray()) {
if (c == '1') {
cnt2++;
}
}
// 1의 개수가 같으면 탐색 종료
if (cnt == cnt2) {
break;
}
ans++;
}
return ans;
}
}
풀이 2: Integer.bitCount() 내장 함수를 활용한 최적화
자바에는 정수의 2진수 표현에서 '1'의 개수를 O(1) 수준으로 매우 빠르게 세어주는 내장 함수인 Integer.bitCount()가 존재합니다. 이를 활용하면 문자열 변환 객체 생성과 반복문 없이 단 몇 줄만으로 속도와 가독성을 극적으로 향상시킬 수 있습니다.
- 탐색 숫자 ans를 1씩 증가시키는 로직은 동일하지만, 1의 개수를 비교하는 과정을 단 한 줄의 조건문으로 처리하여 오버헤드를 최소화합니다.
코드 2
class Solution {
public int solution(int n) {
// n의 2진수 1의 개수를 내장 함수로 한 번에 구함
int cnt = Integer.bitCount(n);
int ans = n + 1;
// ans를 1씩 증가시키며 bitCount 값이 같은 것을 찾음
while (true) {
if (cnt == Integer.bitCount(ans)) {
break;
}
ans++;
}
return ans;
}
}
알고리즘 분류
수학 (Mathematics), 비트 조작 (Bit Manipulation), 완전 탐색 (Brute Force)
'PS > 프로그래머스' 카테고리의 다른 글
| 구명보트 (0) | 2026.04.24 |
|---|---|
| 점프와 순간 이동 (0) | 2026.04.24 |
| 숫자의 표현 (2) | 2026.04.23 |
| 이진 변환 반복하기 (0) | 2026.04.23 |
| JadenCase 문자열 만들기 (0) | 2026.04.23 |