[BOJ] 백준 #1057. 토너먼트 (C++)

최대 1 분 소요

🎨 문제

boj-1057

문제 링크: https://www.acmicpc.net/problem/1057

  • 알고리즘 분류: 수학
  • 난이도: Silver Ⅲ



💬 풀이

매 라운드마다 바뀌는 참가자들의 번호를 이용해서 풀 수 있다.
예를 들면, 예제입력1에서 kim: 8→4→2→1→1, lim: 9→5→3→2→1이다.
즉 어떤 라운드에서 번호가 n이라면 다음 라운드에서 번호는 (n+1)/2다.
또한 두 사람의 번호 차가 1이고, 작은 사람의 번호는 홀수 (=큰 사람의 번호는 짝수)일 때 경기에서 만나게 된다.

아 그리고 조건 마지막에 ‘만약 서로 대결하지 않을 때는 -1을 출력한다’고 되어 있는데, 처음에 이거를 생각 안 하고 풀었는데 맞았다길래 뭐지?했는데 생각해보니까 그런 경우는 발생하지 않는다 ….ㅋ 끝까지 서로 대결하지 않는 경우는 없다.


👩‍💻 코드

C++

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cmath>
using namespace std;

int main() {
	//freopen("input.txt", "rt", stdin);
	int N, kim, lim;
	cin >> N >> kim >> lim;

	int round = 1;
	int survivor_n = N;
	while (survivor_n != 1) {
		if ((abs(kim - lim) == 1) && (min(kim, lim) % 2 == 1)) {
			// 둘이 번호가 1차이 나고,
			// 번호 작은애가 홀수, 큰애가 짝수면 => 대결
			break;
		}

		// 다음 라운드 번호 지정, 다음 라운드 생존자 수
		round++;
		kim = (kim + 1) / 2;
		lim = (lim + 1) / 2;
		survivor_n = (survivor_n + 1) / 2;
	}
	
	cout << round;

	return 0;
}


댓글남기기