본문 바로가기

프로그래머스

5/24[문제풀이] 프로그래머스 Lv2 2개 이하로 다른 비트

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

 

문제 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function solution(numbers) {
 const answer = [];
 
  for (let number of numbers) {
    if (number % 2 === 0) answer.push(number + 1);
    else {
      const etc = [...number.toString(2)];
 
      if (etc.every((e) => e === "1")) {
        etc[0= "10";
      } else {
        for (let x = etc.length - 1; x >= 0; x--) {
          if (etc[x] === "0") {
            etc[x] = "1";
            etc[x + 1= "0";
            break;
          }
        }
      }
      answer.push(parseInt(etc.join(""),2));
        // console.log(answer)
    }
  }
  return answer;
}
cs

 

문제를 보면서 이해를 하는데 생각보다 시간이 꽤 걸렸다.

그리고 어떻게 풀지 생각하는 것에도 시간이 좀 걸렸던 것 같다. 어떠한 규칙이 있을 것 같았기 때문에 그 규칙을 알아내기 위해 십진수 숫자들을 차례대로 이진수로 쭉 바꾸어 써보았더니 어떻게 풀어야 할지 방향이 좀 잡혔던 것 같다.

써보는 것이 생각보다 많이 도움이 되는 것 같다.

 

알아낸 사실... 우선 십진수가

 

1. 짝수인 경우

이진수 변환시 모두 0으로 끝나기 때문에 문제의 요건을 만족해주기 위해서는 이진수 끝의 0을 1로만 바꾸어 준다.

2. 홀수인 경우가 있는데 여기서도 두 가지로 나누어지게 된다.

이진수 변환시

2-1.모든 수가 1인 경우

모든 수가 1인 경우에는 맨 첫 번째 1을 10으로 바꾸어준다.

2-2.그렇지 않은 경우

그렇지 않은 경우에는 가장 마지막 쪽에 있는 숫자 0을 1로 바꾸고 그 다음에 위치한 숫자 1을 0으로 바꾸면 된다.

(다른 지점 2개 이하 유의!!)