코딩 테스트/프로그래머스

프로그래머스 - 예상 대진표 문제 (자바)

https://programmers.co.kr/learn/courses/30/lessons/12985?language=java 

 

코딩테스트 연습 - 예상 대진표

△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N

programmers.co.kr

번호가 큰 선수와 작은 선수를 구별하고

라운드를 진행하면서 

두선수가 만나는 경우 - 두 선수의 번호가 1차이 이면서 작은 수가 홀수 인 경우

(1,2는 가능하지만 2, 3 이면 안되기 때문)

 

만나기 전까지 두 선수 모두 이기는 경우의 번호를 배정

번호가

짝수이면 2로 나눈 값

홀수이면 2로 나눈 값 + 1

ex) 1 -> 1 / 2 + 1 = 1 (int는 소수점 버림)

class Solution {
    public int solution(int n, int a, int b) {
        // 두 선수의 번호가 큰 선수와 작은 선수를 구함
        int min = Math.min(a, b);
        int max = Math.max(a, b);
        
        int round = 1; // 진행된 라운드
        
        while (true) {
            // 두 선수가 만난 경우
            // 두 선수의 번호의 차이가 1 && 번호가 작은 선수의 번호가 짝수 아닌 경우
            if (min + 1 == max && min % 2 != 0) {
                break;
            }
            
            // 라운드에서 이기는 경우 각 선수의 다음 번호 배정
            // 짝수인 경우 2로 나눈 값, 홀수인 경우 2로 나눈 값 + 1 
            min = min % 2 == 0 ? min / 2 : min / 2 + 1;
            max = max % 2 == 0 ? max / 2 : max / 2 + 1;
            
            // 라운드 진행
            round++;
        }
        
        return round;
    }
}