문제
첫번째로 떠올린 해결방안은 1씩 증가시키며 주어진 수와 비트를 비교하는 방식입니다. 하지만 테스트 케이스 10, 11에서 시간 초과로 실패했습니다. 코드는 아래와 같습니다.
첫번째 코드
while (true) {
result++;
String binaryString = Long.toBinaryString(result);
int cnt = 0;
if (target.length() != binaryString.length()) {
target = "0" + target;
}
for (int j = 0; j<binaryString.length(); j++) {
if (binaryString.charAt(j) != target.charAt(j)) {
cnt++;
}
}
if (cnt == 1 || cnt == 2) {
break;
}
}
answer[i] = result;
이를 해결하고자 비트 패턴을 확인하며 다음과 같은 해결방안을 떠올렸습니다.
10
비트를 넣어준다면 답이 되게 됩니다.11101
이 있다면 11110
이 정답이 됩니다. 혹시 0이 없다면 111
를 1011
와 같이 처리하게 됩니다.import java.util.*;
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
for (int i = 0; i<numbers.length; i++) {
long result = numbers[i];
String target = Long.toBinaryString(numbers[i]);
if (result % 2 == 0) {
answer[i] = result + 1;
} else {
int idx = target.lastIndexOf("0");
if (idx == -1) {
String tmp = "10" + target.substring(1, target.length());
answer[i] = Long.parseLong(tmp, 2);
} else {
String tmp = target.substring(0, idx) + "10" + target.substring(idx + 2, target.length());
answer[i] = Long.parseLong(tmp, 2);
}
}
}
return answer;
}
}
✏️ TIP
1 . Long.toBinaryString(num)
과 Long.toString(num, 2)
을 통해 쉽게 비트 변환이 가능합니다.
2. lastIndexOf
을 활용하여 String에서 특정 값의 마지막 인덱스를 반환받을 수 있습니다. 혹시, 만족하는 값이 없다면 -1을 반환합니다.
3. substring
을 활용하여 String에 대한 슬라이싱이 가능하게 됩니다.
4. Long.parseLong(bit, 2)
을 통해 비트를 다시 정수로 변환이 가능합니다.
피드백 및 개선점은 댓글을 통해 알려주세요😊