📍 예상 대진표
처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 궁금해졌습니다. 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성해 주세요. 단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.
다음 라운드에서 받게 되는 번호는 원래 번호를 2로 나눈 몫을 올림한 값으로, (a + 1) / 2
와 같다.
이걸 이용해서 두 수의 차이가 1이 날 때까지 반복해주었다.
class Solution {
fun solution(n: Int, a: Int, b: Int): Int {
var (numA, numB) = a to b
var answer = 0
(1..20).map {
if (numA - numB == 1 || numA - numB == -1) answer = it
numA = (numA + 1) / 2
numB = (numB + 1) / 2
}
return answer
}
}
2진법을 사용한 풀이가 있었다. 완벽하게 이해는 안 가지만, 하나하나 직접 계산해봤을 때 맞는 것 같아서 신기해하는 중이다. 우선 대진표과 이진 트리와 비슷한 형식임을 사용한 것 같았다. 내가 이해한 건 다음과 같다.
이해한 것에 만족을 해야겠다. 나중에 이걸 활용을 한다? 그때는 내가 과연 사람이 맞는가에 대해 고민을 해야할 것이다.
class Solution {
fun solution(n: Int, a: Int, b: Int) = ((a - 1) xor (b - 1)).toString(2).length
}
규칙을 찾는 건 정말 쉬웠는데, 이진법으로 접근해서 풀 수 있었다는 사실은 정말 꿈에도 몰랐다. 만약 내가 공부를 열심히 했더라면 문제를 보자마자 어? 이진트리다. 라고 생각할 수 있었을까? 매번 나의 부족함을 느끼며 풀이를 마무리하는 것 같다.