import java.util.*;
class Solution {
public ArrayList<Long> solution(long[] numbers) {
ArrayList<Long> answer = new ArrayList<>();
for(long x : numbers){
if(x % 2 == 0){
String binaryString = Long.toString(x,2); // 2진수 변환
String str = binaryString.replaceFirst("0$", "1");
answer.add(Long.parseLong(str, 2));
}
else{
String n = Long.toString(x,2);
if(!n.contains("0")){
String temp = "10" + n.substring(1,n.length());
answer.add(Long.parseLong(temp,2));
}
// 홀수이면서 1과 0이 포함되어있으면 -> 마지막 0을 1로 바꾸고 그 뒤에 1을 0으로 바꿔주면 된다.
else{
// 1 0 0 1
// 1 0 1 0
char[] temp = n.toCharArray();
int idx = n.lastIndexOf("0");
temp[idx] = '1';
temp[idx + 1] = '0';
long aa = Long.parseLong(String.valueOf(temp), 2);
answer.add(aa);
}
}
}
return answer;
}
}
0$ -> 문자열 끝($)의 0을 의미
짝수
짝수인 경우에는 무조건 1의 자리가 0이다. 1의 자리 수를 1로 바꿔주면 문제에 해당되는 수를 찾을 수 있다
ex) 2 -> 10 -> 11 -> output data : 3
ex) 4 -> 100 -> 101 ->output data : 5
ex) 6 -> 110 -> 111 -> output data : 7
홀수
홀수인 경우에는 2가지의 경우로 나뉜다. 첫번째로는 0이 포함되지 않는 홀수와 두번째로는 0이 포함되는 홀수의 경우이다.
첫번째 경우에는 그냥 젤 앞의 1을 0으로 바꿔주고 앞에 1을 붙여주면된다.
두번째 경우에는 마지막 0을 1로 바꾸고 , 그 뒤에있는 1을 0으로 바꿔주면 된다.
ex) 5 -> 6
ex) 3 -> 5
ex) 7 -> 11
ex) 9 -> 12
두번째 경우의 홀수인 경우에 바꾸는 부분이 헷갈려서 너무 어려웠다.
그냥 문자열 조절하는게 어려우면 char 단위로 쪼개서 하나하나 씩 수정하는 방식으로 잘 해보자.
[ 알아야 할 것들 ]
replaceFirst("0$","1"); -> 처음 나오는 문자를 "1"로 변경
Long.toString(x,2); -> 2진수 문자 형태로
Long.parseLong(temp,2) -> 2진수를 숫자로
좋은 글이네요. 공유해주셔서 감사합니다.