https://programmers.co.kr/learn/courses/30/lessons/12985
1번~8번 참가자가 있다고 가정해보자. (N=8)
1번 참가자 vs 2번 참가자
3번 참가자 vs 4번 참가자
5번 참가자 vs 6번 참가자
7번 참가자 vs 8번 참가자
이렇게 대결을 펼치고 각 대결의 승자는 순서대로 번호를 다시 부여받는다.
1번 참가자 vs 2번 참가자 => 승자는 1번 참가자가 된다.
3번 참가자 vs 4번 참가자 => 승자는 2번 참가자가 된다.
5번 참가자 vs 6번 참가자 => 승자는 3번 참가자가 된다.
7번 참가자 vs 8번 참가자 => 승자는 4번 참가자가 된다.
그리고 대결을 다시 펼친다.
1번 참가자 vs 2번 참가자
3번 참가자 vs 4번 참가자
이번 각 대결의 승자 또한 번호를 다시 부여받는다.
1번 참가자 vs 2번 참가자 => 승자는 1번 참가자가 된다.
3번 참가자 vs 4번 참가자 => 승자는 2번 참가자가 된다.
...
이렇게 반복된다.
import java.util.*;
class Solution
{
public int solution(int n, int a, int b)
{
int answer = 1;
// a가 큰 쪽으로 기준 잡기
if (a < b) {
int tmp = a;
a = b;
b = tmp;
}
while (true) {
if (a - b == 1 && b % 2 == 1) {
break;
}
if (b > 1) {
if (b % 2 == 1) {
b++;
}
b = b / 2;
}
if (a % 2 == 1) {
a++;
}
a = a / 2;
answer++;
}
return answer;
}
}
간과했던 부분
처음에 while문을 다음과 같이 작성했었다.
while (a - b > 1) { if (b > 1) { if (b % 2 == 1) { b++; } b = b / 2; } if (a % 2 == 1) { a++; } a = a / 2; answer++; }
하지만 이렇게 작성해버리면 a = 3, b = 2가 들어가면,
기대 값 : 2
실제 값 : 1
...이렇게 나오게 된다. 두 수의 차가 1이라고 무조건 서로 겨루는 것은 아니기 때문이다.