프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이
1. 짝수는 계산이 필요없이 1을 더하면 된다.
2. 홀수는 2진수로 변환하고 가장 작은 비트부터 0을찾는데, 0이 있으면 해당비트를 1로 변환하고, 오른쪽 비트를 0으로 바꾼다.

3. 코드로 변환하는 과정은 아래와 같다.
sb = new StringBuilder(Long.toBinaryString(numbers[i]));
for (int j = sb.length() - 1; j >= 0; j--) { // 0비트를 찾기
if (sb.charAt(j) == '0') {
answer[i] = numbers[i] + answer[i] = numbers[i] + (long) Math.pow(2, sb.length() - j - 1) / 2;
break;
}
}
예시 그림을 보면 홀수일 때 처음 0을 발견한 자리는 3번째고, 10진수로 변환하면 ' 4 ' 의 자리이다. 해당자리를 1로 바꾸고 아래 비트를 0으로 바꾸면 결국 [ 해당자리 / 2 ] 를 더한 값이다. ( + 4 - 2 )
처음 0을 발견하는 위치가 달라져도 항상 [ 기존값 + ( 발견위치 / 2 ) ] 라는 결과를 가진다.
4. 7과 15같은 2진수에 0을 포함하지 않는 값은 항상 num + ( long ) Math.ceil((double) numbers[i] / 2) 라는 결과값을 같는다.
나의풀이 ( 코드 )
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
StringBuilder sb;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] % 2 == 0) {
answer[i] = numbers[i] + 1;
continue;
}else {
sb = new StringBuilder(Long.toBinaryString(numbers[i]));
for (int j = sb.length() - 1; j >= 0; j--) { // 0비트를 찾기
if (sb.charAt(j) == '0') {
answer[i] = numbers[i] + (long) Math.pow(2, sb.length() - j - 1) / 2;
break;
}
}
}
if (answer[i] == 0) {
answer[i] = numbers[i] + (long) Math.ceil((double) numbers[i]/2);
}
}
return answer;
}
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/JAVA 자바] 가장 큰 수 (0) | 2023.12.05 |
|---|---|
| [프로그래머스/JAVA 자바] 쿼드압축 후 개수 세기 (0) | 2023.12.04 |
| [프로그래머스/JAVA 자바] 택배상자 (0) | 2023.11.30 |
| [프로그래머스/JAVA 자바] [PCCP 기출문제] 1번 (0) | 2023.11.25 |
| [프로그래머스/JAVA 자바] [PCCE 기출문제] 9번 / 이웃한 칸 (0) | 2023.11.25 |