풀이
문제가 길지만 결국 요약하면 A라는 사람과 B라는 사람이 만나게 되는 대진표가 몇 번째 라운드인지만 출력하면 된다.
N명의 사람만큼 배열을 채워 넣고, 대진을 비교하면 된다.
언제까지 비교하면 될까?
8 -> 4 -> 2 -> 1
8명이라면 총 3번의 토너먼트만 돌리면 된다.
매칭 비교는
A라는 사람 혹은 B라는 사람이 다른 사람과 매칭 하게 되면 반드시 A 혹은 B가 이기고,
그 외에는 왼쪽 사람이 이긴다고 가정하면 된다. (왼쪽이나 오른쪽이나 누가 올라와도 결국 A와 B가 이기게 되므로)
#include <iostream>
#include <vector>
using namespace std;
int solution(int n, int a, int b)
{
vector<int> v(n, 0);
for(int i = 0; i < n; i++) v[i] = i + 1;
int round = 0;
while(n != 1) {
vector<int> win;
round++;
for(int i = 1; i <= n; i+=2) {
if((v[i-1] == a && v[i] == b) || (v[i-1] == b && v[i] == a)) return round;
else if(v[i-1] == a || v[i-1] == b) win.push_back(v[i-1]);
else if(v[i] == a || v[i] == b) win.push_back(v[i]);
else win.push_back(v[i-1]);
}
v = win;
n /= 2;
}
return -1;
}
'Algorithm' 카테고리의 다른 글
[프로그래머스] 위장 (C++) (0) | 2021.05.31 |
---|---|
[프로그래머스] 괄호 회전하기 (C++) (0) | 2021.05.31 |
[프로그래머스] 소수 찾기 (C++) (0) | 2021.05.22 |
[프로그래머스] 전화번호 목록 (C++) (0) | 2021.05.21 |
[프로그래머스] 행렬 테두리 회전하기 (C++) (0) | 2021.05.21 |