예상 대진표 | 프로그래머스

김태영·2024년 6월 12일
0

코딩 테스트

목록 보기
17/33
post-thumbnail

📍 예상 대진표

💡 문제

처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 궁금해졌습니다. 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성해 주세요. 단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.

⚠️ 제한사항

  • N : 21 이상 220 이하인 자연수 (2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.)
  • A, B : N 이하인 자연수 (단, 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진법을 사용한 풀이가 있었다. 완벽하게 이해는 안 가지만, 하나하나 직접 계산해봤을 때 맞는 것 같아서 신기해하는 중이다. 우선 대진표과 이진 트리와 비슷한 형식임을 사용한 것 같았다. 내가 이해한 건 다음과 같다.

  • 대진표는 2명씩 짝을 지어 대결하는 구조이다. 2진수도 0과 1이 짝을 지어 하나의 자릿수를 차지한다.
    • 0과 1 다음은 10과 11인 것처럼
  • xor은 같지 않으면 1이다.
    • 0111과 1000은 xor 연산시 1111이 된다.
  • 번호가 1번 부터 시작하기 때문에 0번으로 맞춰주려고 a와 b에 1을 빼서 연산했다.
  • 라운드 수는 두 수의 비트 거리를 구하면 구할 수 있다.
    • 서로 상대인 경우라면, 비트의 앞자리 부분이 같아 0으로 계산된다.
      • 110과 111은 001이 된다. 즉, 거리는 1
    • 거리가 있다면, 비트의 앞자리 부분은 두 수의 거리만큼 다르기 때문에 앞자리 부분이 1로 계산된다.
      • 1000과 1은 1001이 된다. 즉, 거리는 4

이해한 것에 만족을 해야겠다. 나중에 이걸 활용을 한다? 그때는 내가 과연 사람이 맞는가에 대해 고민을 해야할 것이다.

class Solution {
    fun solution(n: Int, a: Int, b: Int) = ((a - 1) xor (b - 1)).toString(2).length
}

💭 후기

규칙을 찾는 건 정말 쉬웠는데, 이진법으로 접근해서 풀 수 있었다는 사실은 정말 꿈에도 몰랐다. 만약 내가 공부를 열심히 했더라면 문제를 보자마자 어? 이진트리다. 라고 생각할 수 있었을까? 매번 나의 부족함을 느끼며 풀이를 마무리하는 것 같다.

profile
화이팅

0개의 댓글

관련 채용 정보