코딩테스트

[JS] 예상 대진표

미안하다 강림이 좀 늦었다 2023. 11. 29. 20:59

 

 

알고리즘

a의 번호가 b의 번호보다 클 수도 있다. 그래서 뭐가 더 작고 큰지 알아야 한다. (주저리에서 더 자세히 쓴다.)

1. 다음 라운드에 진출할 경우 배정받는 번호는 (n + 1) / 2이다. 

2. A, B 중 더 작은 번호를 배정받은 사람의 번호가 홀수이고, 더 큰 번호를 배정받은 사람의 번호가 더 작은 번호를 배정받은 사람의 번호 + 1이면 그 라운드에서 만난다.

 

 

코드

function solution(n, a, b) {
    var answer = 0;
    let less = Math.min(a, b);
    let greater = Math.max(a, b);

    while (true) {
        if (less % 2 === 1 && less + 1 === greater) { return answer + 1; }
        answer++;
        less = (less + 1) >> 1;
        greater = (greater + 1) >> 1;
    }
}

 

 

주저리

금방 풀어서 딱히 할 말은 없는데 다 풀고 질문하기 보다가 a랑 b를 시프트 연산하다가 둘이 같아지면 끝난다는 걸 깨달았다.  a가 크든 b가 크든 전혀 상관없다. 그래서 아래 코드가 더 좋은 코드다.

function solution(n, a, b) {
    var answer = 0;

    while (a !== b) {
        answer++;
        a = (a + 1) >> 1;
        b = (b + 1) >> 1;
    }

    return answer;
}