문제 링크 : 코딩테스트 연습>2017 팁스타운>예상 대진표
접근 방법
- 1 ~ N 차례로 배정
- 1<->2, 3<->4 .. 승부
- 이기면 1 ~ N/2번으로 차례대로 재배정
- return A, B가 만나는 라운드
- A, B 는 무조건 이김
규칙1
번호 | 몫 | 나머지 | 합 |
---|
1 | 1 / 2 = 0 | 1 % 2 = 1 | 1 |
2 | 2 / 2 = 1 | 2 % 2 = 0 | 1 |
3 | 3 / 2 = 1 | 3 % 2 = 1 | 2 |
4 | 4 / 2 = 2 | 4 % 2 = 0 | 2 |
5 | 5 / 2 = 2 | 5 % 2 = 1 | 3 |
6 | 6 / 2 = 3 | 6 % 2 = 0 | 3 |
7 | 7 / 2 = 3 | 7 % 2 = 1 | 4 |
8 | 8 / 2 = 4 | 8 % 2 = 0 | 4 |
- 몫과 나머지의 합으로 다음 차례를 알 수 있다.
코드1
function solution(n, a, b) {
let count = 0;
while (a !== b) {
a = Math.floor(a / 2) + a % 2
b = Math.floor(b / 2) + b % 2
count++
}
return count;
}
규칙2
번호 | 몫 | 올림 |
---|
1 | 1 / 2 = 0.5 | 1 |
2 | 2 / 2 = 1 | 1 |
3 | 3 / 2 = 1.5 | 2 |
4 | 4 / 2 = 2 | 2 |
5 | 5 / 2 = 2.5 | 3 |
6 | 6 / 2 = 3 | 3 |
7 | 7 / 2 = 3.5 | 4 |
8 | 8 / 2 = 4 | 4 |
- 규칙1을 다시 생각해 보면 한번에 올림을 해줘도 같은 결과를 찾을 수 있다.
코드2
function solution(n, a, b) {
let count = 0;
while (a !== b) {
a = Math.ceil(a / 2)
b = Math.ceil(b / 2)
count++
}
return count;
}