Life Engineering
[프로그래머스] 2개 이하로 다른 비트 (Java) 본문
https://programmers.co.kr/learn/courses/30/lessons/77885#
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
int cnt=0;
for (long number: numbers){
long lastOne=-1;
long result=number;
long i=0;
while (true){
if ((number & (1L<<i)) >0){ //1발견시
lastOne=i;
i++;
}
else{ //0발견 시 => 1로
result=result|(1L<<i);
if (lastOne!=-1){ //마지막 1을 0으로
result=result^(1L<<lastOne);
}
answer[cnt++]=result;
break;
}
}
}
return answer;
}
}
1. 숫자를 쭉 0번째부터.. & 연산 해주면서 체크한다. (뒤에서부터 체크)
n & (1L << i) 연산 시
=>1이 나올때, 그 위치를 저장하고 i++를 증가시켜 다시 탐색한다.
=>0이 나올 때(즉 뒤에서부터 i번째 자리가 0일때), 그 부분을 1로 바꿔주고 마지막 1이 나온 인덱스에 대해 0으로 바꿔준 후, answer에 넣고 탐색을 종료한다.
처음엔 (1<<i) 이렇게 해서 테스트케이스 마지막 2개에 대해 계속 시간초과가 떴다..
질문 목록을 보니까 이렇게 하면 int로 받아들여 제대로 수가 원하는대로 나오지 않음을 알았고, 1 상수를 Long형으로 변환해서 했다니 통과하였다.
다른 분들의 코드를 보니 홀/짝으로 구분해서 푸는 방법이 있었다.
짝수면=> +1 해주고 (제일 맨 끝자리가 0일것이므로)
홀수면=>내가 풀었던 방식을 적용한다.
'Problem Solving' 카테고리의 다른 글
[BOJ 1744] 수 묶기 (Java) (0) | 2022.03.03 |
---|---|
[BOJ 17825] 주사위 윷놀이 (Java) (0) | 2022.03.02 |
[프로그래머스] 후보키 (Java) (0) | 2022.03.01 |
[프로그래머스] 삼각 달팽이 (Java) (0) | 2022.03.01 |
[BOJ 13305] 주유소 (Java) (0) | 2022.02.25 |