/ BOJ

BOJ_1057_토너먼트_JAVA

문제 : 토너먼트

링크 : BOJ_1057_토너먼트

접근 방식

간단한 시뮬레이션 문제이다. 토너먼트의 참여 멤버가 총 16명이라고 가정을 해보자.

(1,2) (3,4) (5,6) (7,8) (9,10) (11,12) (13,14) (15,16)

이렇게 짝이 지어진다. 짝이 지어지는 수들의 공통점은, 두 수의 차이가 1이면서 2로 나누었을 때 서로 다른 수를 가진다는 것이다.

주어진 문제는 A와 B가 각각 다른 위치에서 경기를 시작할 때, 몇 라운드에서 만나는지 찾아야 한다. 따라서 각 수를 짝수의 경우 1/2, 홀수의 경우 1/2+1하여 축소시켜가면서 카운팅을 하고, 멈추는 시점은 두 수의 차이가 1이면서 2로 나누었을 때 서로 다른 수를 가지면 멈추도록 하면 된다.

소스 코드


import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.IOException;

public class BOJ_1057_토너먼트 {

	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(in.readLine()," ");

		int N = Integer.parseInt(st.nextToken());

		int A = Integer.parseInt(st.nextToken());

		int B = Integer.parseInt(st.nextToken());
		int cnt =1;
		if(Math.abs(A-B) == 1 && A/2 != B/2) {
			System.out.println(cnt);
			return;
		}

		while(N > 2) {
			if(Math.abs(A-B) == 1 && A/2 != B/2) {
				System.out.println(cnt);
				return;
			}
			if(A %2 == 0) {
				A = A/2;
			}else {
				A = A/2+1;
			}
			if(B%2 == 0) {
				B = B/2;
			}else {
				B = B/2+1;
			}
			cnt++;
		}


	}

}