본문 바로가기
Algorithm/Baekjoon

Baekjoon 1057 토너먼트 JAVA

by Hunveloper 2022. 6. 21.
728x90

 

1057번: 토너먼트

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

www.acmicpc.net

문제

김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를 한다. 이긴 사람은 다음 라운드에 진출하고, 진 사람은 그 라운드에서 떨어진다. 만약 그 라운드의 참가자가 홀수명이라면, 마지막 번호를 가진 참가자는 다음 라운드로 자동 진출한다. 다음 라운드에선 다시 참가자의 번호를 1번부터 매긴다. 이때, 번호를 매기는 순서는 처음 번호의 순서를 유지하면서 1번부터 매긴다. 이 말은 1번과 2번이 스타를 해서 1번이 진출하고, 3번과 4번이 스타를 해서 4번이 진출했다면, 4번은 다음 라운드에서 번호 2번을 배정받는다. 번호를 다시 배정받은 후에 한 명만 남을 때까지 라운드를 계속 한다.

마침 이 스타 대회에 임한수도 참가했다. 김지민은 갑자기 스타 대회에서 우승하는 욕심은 없어지고, 몇 라운드에서 임한수와 대결하는지 궁금해졌다. 일단 김지민과 임한수는 서로 대결하기 전까지 항상 이긴다고 가정한다. 1 라운드에서 김지민의 번호와 임한수의 번호가 주어질 때, 과연 김지민과 임한수가 몇 라운드에서 대결하는지 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 참가자의 수 N과 1 라운드에서 김지민의 번호와 임한수의 번호가 순서대로 주어진다. N은 2보다 크거나 같고, 100,000보다 작거나 같은 자연수이고, 김지민의 번호와 임한수의 번호는 N보다 작거나 같은 자연수이고, 서로 다르다.

출력

첫째 줄에 김지민과 임한수가 대결하는 라운드 번호를 출력한다. 만약 서로 대결하지 않을 때는 -1을 출력한다.

풀이

1. 출력에서 서로 대결하지 않을 때는 -1을 출력한다고 했지만, 토너먼트 특성상, 최종 결승에서 한 번은 만남

2. 토너먼트 특성상 대결하는 인원들이 반씩 감소하면서, 승자가 결정된다.

3. 서로 이기는 사람을 반씩 감소시킨다고 생각하고 반복되는 횟수를 찾는다.

4. 두명의 위치가 동일한 번호에 위치하면 같은 라운드에 있다고 판단하고 반복을 종료시킴

코드
import java.util.*;

public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt(), jm=sc.nextInt(), hs=sc.nextInt(), ans=0;
		// 두 인원이 싸우지 못하는 경우는 없다, 만날때까지 싸우고, 최종 결승에서 한번은 만나게 된다.
		while(jm!=hs) {	// 같은 값이 나올때까지 반복
			jm=(jm+1)/2;
			hs=(hs+1)/2;
			ans++;
		}
		System.out.println(ans);
		// 기존 위치에 1을 더하는 이유
		// jm=8, hs=9일때 바로 계산하면 둘다 4가 나오지만 실제 값은 4와 5가 되어야 한다.
		// (1,2), (3,4) / (5,6), (7,8) / (9,10)
		
		// 홀수의 경우를 생각해서 1을 더함
		// jm=1, hs=2
		// x에 1을 더하지 않은 경우
		// 1/2 = 0, 2/2 = 1	=> 다음 라운드에서 부여되는 번호가 다름
		// x에 1을 더한 경우
		// (1+1) / 2 = 1, (2+1) / 2 = 1 => 다음 라운드에서 부여되는 번호가 동일
	}
}

 

728x90
728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

Baekjoon 2576 홀수 JAVA  (0) 2022.07.07
Baekjoon 11724 연결 요소의 개수 JAVA  (0) 2022.07.07
Baekjoon 16472 고냥이 JAVA  (0) 2022.06.21
Baekjoon 1092 배 JAVA  (0) 2022.06.21
Baekjoon 2857 FBI JAVA  (0) 2022.06.21

댓글