class Solution {
public int solution(int n) {
int answer = 0;
StringBuilder bin = new StringBuilder('0' + Integer.toBinaryString(n));
int len = bin.length();
int count = (bin.charAt(bin.length() - 1) == '0') ? -1 : 0;
int i;
for (i = bin.length() - 2; i >= 0; i--) {
if (bin.charAt(i) == '0') break;
count++;
}
bin.setLength(i);
bin.append('1');
i++;
while (i < len - count) {
bin.append('0');
i++;
}
while (i < len) {
bin.append('1');
i++;
}
answer = Integer.parseInt(bin.toString(), 2);
return answer;
}
}
제출하니 몇 개는 실패에 효율성 테스트는 전부 시간초과가 떴다.
다음에 다시 도전해봐야겠다.
class Solution {
public int solution(int n) {
int answer = n;
StringBuilder bin = new StringBuilder("0");
bin.append(Integer.toBinaryString(n));
int i = bin.length();
int b1 = 1;
while (bin.charAt(--i) == '0') b1 *= 2;
answer -= b1;
b1 *= 2;
int b2 = 1;
while (bin.charAt(--i) == '1') {
answer -= b1;
answer += b2;
b1 *= 2;
b2 *= 2;
}
answer += b1;
return answer;
}
}
처음엔 다음 큰 숫자를 2진수로 먼저 만든 후 그걸 10진수로 변환시키는 방법으로 풀었었는데 그렇게하니 계속 시간초과가 났다.
그래서 2진수를 만들지 않고 규칙만 적용하여 10진수 상태에서 값만 바꿔줬더니 통과했다.
이제보니 StringBuilder도 다시 String으로 바꿔줘도 될듯하다.
String으로 바꾸니 시간초과가 난다;;; 맨 앞에 0 하나 붙이는것때문에 StringBuilder를 써야할듯하다.
다른 사람의 풀이를 보니 비트연산을 통한 풀이가 있었다. 나도 비트를 좀 써버릇해야겠다.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges