문제 보기
https://school.programmers.co.kr/learn/courses/30/lessons/12911
문제
자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의합니다.
- 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수입니다.
- 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 개수가 같습니다.
- 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수입니다.
예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.
자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해 주세요.
제한사항
- n은 1,000,000 이하의 자연수입니다.
풀이방법
다음 큰 숫자의 규칙을 찾아보려다가 그냥 반복문을 사용하여 해결하였다.
머리 쓰는 것보다 컴퓨터가 열심히 계산하게 하는 게 빠르다...
무작정 n보다 하나 더 큰 수부터 2진수로 변환했을 때 1의 개수를 세었고
이게 n을 2진수로 변환했을 때 1의 개수와 같은지 비교하였다.
전체 코드 & 주석
class Solution {
public int solution(int n) {
int nCount1 = count(n); // n의 1의 갯수
int count1 = 0; // 다음 수들의 1의 갯수를 저장할 곳
int addInt = 0; // n에 더해질 수
while (count1 != nCount1) { // 1의 갯수가 서로 다른 동안
addInt++; // n에 더해질 수 증가
count1 = count(n + addInt); // 이번 수의 1의 갯수
}
int answer = n + addInt; // 1의 갯수가 최초로 같은 수
return answer;
}
public int count(int n) { // 어떤 int의 2진수 변환 시 1의 갯수를 세는 메서드
String str = Integer.toBinaryString(n); // 숫자를 2진수 String으로 변환
int count = 0; // 1의 갯수를 세어 저장할 곳
for(int i = 0; i < str.length(); i++) { // String을 순회
if (str.charAt(i) == '1') // 이번 자릿수가 1인가?
count++; // count up
}
return count; // 1의 갯수를 세어 반환
}
}
풀이 GitHub 링크
'ProblemSolve' 카테고리의 다른 글
[프로그래머스][Java] 프로세스 - level 2 (0) | 2024.05.31 |
---|---|
[프로그래머스][Java] 피보나치 수 - level 2 (0) | 2024.05.02 |
[프로그래머스][Java] 숫자의 표현 - level 2 (1) | 2024.05.01 |
[프로그래머스][Java] 이진 변환 반복하기 - level 2 (0) | 2024.05.01 |
[프로그래머스][Java] JadenCase 문자열 만들기 - level 2 (0) | 2024.04.30 |