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
- 프로래머스
- 웹어플리케이션 서버
- 백준
- JPA
- Spring
- 백준 16719
- 백준 17626
- Spring Boot
- 백준 파이썬
- springboot
- with recursive
- sql 기술면접
- Coroutine
- 백준 16236
- 백준 17779
- 백준 19238
- JVM
- MySQL
- MSA
- spring security
- 프로그래머스
- spring cloud
- 백준 15685
- spring oauth
- 백준 16235
- Kotlin
- java 기술면접
- java
- re.split
- 파이썬
Archives
- Today
- Total
시작이 반
[프로그래머스] 다음 큰 숫자(Java 자바) 본문
SMALL
https://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 | result |
78 | 83 |
15 | 23 |
입출력 예#1
문제 예시와 같습니다.
입출력 예#2
15(1111)의 다음 큰 숫자는 23(10111)입니다.
Solution 1
처음에는 해당 숫자를 이진수로 바꾸고 1을 카운트하여 저장하였다.
이후에 숫자를 1씩 더해가면서 이진수로 바꾸고 1을 카운트 하는 것을 반복하면서 처음 숫자보다 크고 1의 수가 같은 숫자를 찾아 갔다.
하지만 이렇게 하면 효율성이 떨어지게 된다.
class Solution {
public int solution(int n) {
int answer = 0;
String now = binary(n);
int nowCount = 0;
for(int i = 0; i < now.length(); i++){
if(now.charAt(i) == '1'){
nowCount++;
}
}
System.out.println(nowCount);
while(true){
n++;
int nextCount = 0;
String next = binary(n);
for(int i = 0; i < next.length(); i++){
if(next.charAt(i) == '1'){
nextCount++;
}
}
if(nowCount == nextCount){
break;
}
}
return n;
}
public String binary(int n){
StringBuilder sb = new StringBuilder();
while(n > 0){
sb.append(n % 2);
n /= 2;
}
sb.reverse();
return sb.toString();
}
}
Solution2
1을 효율적으로 찾는 방법을 찾다보니 Integer 클래스에 bitCount라는 메소드를 알게 되었다.
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
확실히 반복문을 돌면서 1을 찾는 것 보다 효율적이다.
이 메소드를 사용하여 리팩토링을 하였다.
class Solution {
public int solution(int n) {
int answer = 0;
int nowCount = Integer.bitCount(n);
while(true){
n++;
int nextCount = Integer.bitCount(n);
if(nowCount == nextCount){
break;
}
}
answer = n;
return answer;
}
}
핵심 코드, 푸는법:
Integer.bitCount();
LIST
'알고리즘 > Programmers' 카테고리의 다른 글
[프로그래머스] k진수에서 소수 개수 구하기(Java 자바) (0) | 2022.02.05 |
---|---|
[프로그래머스] 땅따먹기(Java 자바) (2) | 2022.02.01 |
[프로그래머스] 올바른 괄호(Java 자바) (0) | 2021.12.21 |
[프로그래머스] 올바른 괄호(Java 자바) (0) | 2021.12.20 |
[프로그래머스] 파일명 정렬(Java 자바) (0) | 2021.12.19 |