본문 바로가기

프로그래머스

6/3[문제풀이] 프로그래머스 Lv2 예상 대진표

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

 

[문제풀이]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function solution(n,a,b) {
 
    var answer = 0;
    
    while(Math.abs (a-b) >= 1 ) {
        
        answer++;
        
        a = a % 2 === 0 ? a / 2 : Math.floor(a / 2+ 1;
 
        b = b % 2 === 0 ? b / 2 : Math.floor(b / 2+ 1;
        
    }
    
    return answer;
    
}
cs

 

문제의 접근 방식이 무엇보다 중요했다고 본다. 문제를 꼼꼼히 읽어 보는 것도...

문제에서 요구하는 a, b가 만나는 사람마다 이겨서 결승전에서 올라오는 라운드(?) 카운트를 구하는 문제이다.

a, b가 만나기 위해서는 계속 서로 이겨서 맞붙기 때문에 결론적으로 숫자가 1밖에 차이가 나지 않는다.

그래서 while 문을 사용하여 절대값 1이 나오기 이전까지 answer를 더해주고 삼항 연산자를 이용해서 숫자가 기존에 짝수 일시에는 나누기 2를, 홀 수 일 시엔 2를 나누고 소수점을 버린 후 1을 더하게 해서 answer를 return 하는 코드를 구성했다. 짝 수, 홀 수인 경우 이렇게 코드를 구현한 이유는 직접 손으로 써보니 이런 규칙이 있어서 사용했던 것 같다.

어떻게 해야 할 지 막막할 때 손으로 적는 것도 많은 도움이 되는 것 같다.

 

아 그리고 9번 줄, 11 번줄 코드를 작성할 때 a = a % 2 = 0 처럼 작성해 내가 생각한 비교 연산이 아닌 대입 연산을 입력하는 실수를 해서 아래와 같이 Invalid left-hand side in assignment 라는 에러가 발생하기도 했다.

 

Invalid left-hand side in assignment 에러에 관한 내용을 검색해보니 부적절한 위치에서 할당 행위를 하려고 할 때 나오는 에러라고 한다. 주의하자.