알고리즘
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;
}
'코딩테스트' 카테고리의 다른 글
[JS] 귤 고르기 (1) | 2023.12.02 |
---|---|
[JS] N개의 최소공배수 (1) | 2023.11.29 |
[JS] 구명보트 (2) | 2023.11.29 |
[JS] 점프와 순간이동 (1) | 2023.11.29 |
[JS] 영어 끝말잇기 (0) | 2023.11.17 |