
-Code
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
for (int i = 0; i < numbers.length; i++) {
answer[i] = getNum(numbers[i] );
}
return answer;
}
// 2개 이하로 다른 비트 찾기
private long getNum(long check) {
// 짝수인 경우에는 맨 마지막 비트가 0이므로 1개만 바꾸면 1개 이하
if (check % 2 == 0) {
return check + 1;
}
// 홀수인 경우 0을 찾아 1로 바꾸는게 해당 값만 바꾸ㅏ사 1개거나
// 이전값을 1증가시키는 경우는 2개 바꾸는 거므로 0을 찾아서 변경
String checkBin = "0" + Long.toBinaryString(check);
// 0 위치 찾기
int zeroIdx = 0;
for (int i = checkBin.length() - 1; i >= 0; i--) {
if (checkBin.charAt(i) == '0') {
zeroIdx = i;
break;
}
}
// 0을 1로 바꾸고 이전 비트의 값을 0으로 변경
StringBuilder sb = new StringBuilder();
for (int i = 0; i < checkBin.length(); i++) {
if (i == zeroIdx + 1) {
sb.append('0');
} else if (i == zeroIdx) {
sb.append('1');
} else {
sb.append(checkBin.charAt(i));
}
}
return Long.parseLong(sb.toString(), 2);
}
}
처음에 반복문으로 찾으려 했으나 시간 초과 문제가 발생할 수 있었습니다.
그래서 이를 어떻게 해야 시간문제를 해결하지 고민을 하다 못 찾아서 힌트를 찾아보니 짝수면 1만 증가해도 답이고 홀수의 경우 0을 변경하는 게 가장 작은 수여서 수가 아닌 문자열의 개수만큼만 돌면 되어 시간문제가 해결됨을 알고 해결했습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 24035번 Impartial Offerings (0) | 2026.04.06 |
|---|---|
| [프로그래머스/Java] 삼각 달팽이 (0) | 2026.04.05 |
| [백준/Java] 33904번 삼각형 (1) | 2026.04.05 |
| [프로그래머스/Java] 오픈채팅방 (0) | 2026.04.05 |
| [백준/Java] 33904번 불필요한 for문 (0) | 2026.04.04 |