https://programmers.co.kr/learn/courses/30/lessons/77885
생각보다 신경 써야하는게 많은 문제
기본적으로 짝수 홀수부터 나눠야한다.
짝수면 + 1만 진행 하면된다.
이유는 짝수의 2진수는 모두 0으로 끝나기 때문에 끝을 1로 바꾸는 것 만으로 해결이 가능하기 때문
ex)
10 -> 11
100 -> 101
홀수는 상대적으로 복잡해진다.
0을 미포함하는 경우 즉 1로만 이루어진 경우 앞에서 2번째 자리에 0을 삽입하여 해결
ex) 111 -> 1011
0을 포함하는 경우 마지막 0을 1로 바꾸고 그 뒤에 1을 0으로 바꾸어서 해결
ex) 10011 -> 10101
// 프로그래머스 2개 이하로 다른 비트 문제
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] % 2 == 0) {
answer[i] = numbers[i] + 1;
} else {
StringBuilder temp = new StringBuilder();
String binaryString = Long.toBinaryString(numbers[i]);
if (!binaryString.contains("0")) {
// 맨 앞을 10으로
temp.append("10");
// 나머지 자리수를 모두 1로
temp.append(binaryString.substring(1).replace("0", "1"));
} else {
int lastIndex = binaryString.lastIndexOf("0");
int firstOneIndex = binaryString.indexOf("1", lastIndex);
// 마지막 0을 1로 수정
temp.append(binaryString, 0, lastIndex).append("1");
// 마지막 0 다음 1을 0으로 수정
temp.append("0");
// 그 다음 비트열
temp.append(binaryString.substring(firstOneIndex + 1));
}
answer[i] = Long.parseLong(temp.toString(), 2);
}
}
return answer;
}
}
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 오랜 기간 보호한 동물(1) (SQL) (0) | 2021.06.01 |
---|---|
프로그래머스 - 숫자의 표현 문제 (자바) (0) | 2021.06.01 |
프로그래머스 - 삼각 달팽이 문제 (자바) (0) | 2021.05.31 |
프로그래머스 - 예상 대진표 문제 (자바) (0) | 2021.05.31 |
프로그래머스 - 방금그곡 문제 (자바) (0) | 2021.05.08 |