알고리즘

백준 1057번 토너먼트 (JAVA)

박카스마시며코딩 2023. 9. 14. 22:24

https://www.acmicpc.net/problem/1057

 

1057번: 토너먼트

김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를

www.acmicpc.net

 

저는 구현을 통해 문제를 해결하였습니다.

(1,2) , (3,4) , (5,6) .... 이렇게 매칭이 되고 승자는 다음 라운드에 1 , 2 , 3, ... 이렇게 되기에 규칙을 찾았습니다.

때문에 (x+1) % 2이 다음 라운드의 번호가 되게 됩니다.

즉 김지민과 임한수가 1 차이 날 때 까지 위의 공식을 대입하면 됩니다. 또한, 1 차이만 나는 것이 아니라 큰 값이 짝수여야만 매칭이 되기에 이를 고려해서 작성해 문제를 해결하였습니다.

 

package BOJ.etc;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_1057 {
    private static final int NOT_FOUND = -1;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int a = stoi.apply(st.nextToken());
        int b = stoi.apply(st.nextToken());
        if(a > b){
            int temp = a;
            a = b;
            b = temp;
        }
        int cnt = 1;
        while(a < b){
            if(a+1 == b && b % 2 == 0){
                break;
            }
            a = (a+1)/2;
            b = (b+1)/2;
            cnt++;
        }
        System.out.println(cnt);
    }
}