ALGORITHM/PROGRAMMERS

[프로그래머스] 2개 이하로 다른 비트 (월간 코드 챌린지 시즌2)

0298 2021. 7. 29. 19:51

https://programmers.co.kr/learn/courses/30/lessons/77885

 

코딩테스트 연습 - 2개 이하로 다른 비트

 

programmers.co.kr

2021-07-29


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 || numbers[i] % 4 == 1) answer[i] = numbers[i] + 1;
            else {
                String val = Long.toBinaryString(numbers[i]);
                if ((numbers[i] + 1) % 4 == 0) val = "0" + val;
                int index = val.lastIndexOf("01");
                val = val.substring(0, index) + "10" + val.substring(index + 2, val.length());
                answer[i] = Long.parseLong(val, 2);
            }
        }
        return answer;
    }
}
cs

#문제풀이

 

규칙을 찾는데 되게 오래 걸렸다. 실제 시험이었으면 좀 멘붕 왔을 수도,,? 

 

1. 짝수는 +1을 해주면 된다. 

 

2. 홀수의 경우 복잡해진다. 

1) 아래와 같이 +1 만 되는 경우는 4로 나눴을 때 나머지가 1인 경우여서 짝수와 함께 묶어줬다. 

3 -> 5

5 -> 6

7 -> 11

9 -> 10

11 -> 13

13 -> 14

15 -> 23

17 -> 18

19 -> 21

 

2) 그 외 나머지 홀수의 경우는 가장 나중에 나온 01이 10으로 바뀐다는 규칙을 찾아서, 바꿔줬다. 그리고 값+1 했을 때 4로 나눠떨어지는 경우에는, 앞에 0도 붙여주었다.

3 -> 5

011 -> 101

 

7 -> 11

0111 -> 1011

 

11 -> 13

1011 -> 1101

 

15 -> 23

01111 -> 10111

 

19 -> 21

10011 -> 10101

 

 

나는 이렇게 힘들게? 억지로? 풀었고, 다른 사람들은 어떻게 풀었나 찾아봤다.

프로그래머스에서 되게 신기한 풀이를 봤다. 

 

현재 array를 복사한다음에 복사된 array를 ++ 해주고 기존 값과 +1 된 값을 xor연산을 해주고 >>> 2 연산을 해준 후 다시 복사된 array에 더해준다. 

 

연산을 풀어보니 이해는 되는데 어떻게 생각했는지 모르겠다,,