n명의 권투선수가 권투 대회에 참여했고 각각 1번부터 n번까지 번호를 받았습니다. 권투 경기는 1대1 방식으로 진행이 되고, 만약 A 선수가 B 선수보다 실력이 좋다면 A 선수는 B 선수를 항상 이깁니다. 심판은 주어진 경기 결과를 가지고 선수들의 순위를 매기려 합니다. 하지만 몇몇 경기 결과를 분실하여 정확하게 순위를 매길 수 없습니다.
선수의 수 n, 경기 결과를 담은 2차원 배열 results가 매개변수로 주어질 때 정확하게 순위를 매길 수 있는 선수의 수를 return 하도록 solution 함수를 작성해주세요.
import java.util.HashSet;
class Solution {
private static Player[] players;
public int solution(int n, int[][] results) {
int answer = 0;
players = new Player[n + 1];
for (int i = 0; i <= n; i++) {
players[i] = new Player(new HashSet<>(), new HashSet<>());
}
for (int i = 0; i < results.length; i++) {
for (int j = 0; j < 2; j++) {
int win = results[i][0];
int lose = results[i][1];
players[win].lose.add(lose);
players[lose].win.add(win);
}
}
for (int i = 1; i <= n; i++) {
HashSet<Integer> loseToI = players[i].lose;
HashSet<Integer> winToI = players[i].win;
HashSet<Integer> copyLoseToI = new HashSet<>(loseToI);
HashSet<Integer> copyWinToI = new HashSet<>(winToI);
for (Integer loseP : copyLoseToI) {
if (players[loseP].lose != null) {
loseToI.addAll(players[loseP].lose);
}
}
for (Integer winP : copyWinToI) {
if (players[winP].win != null) {
winToI.addAll(players[winP].win);
}
}
}
for (int i = n; i > 0; --i) {
HashSet<Integer> loseToI = players[i].lose;
HashSet<Integer> winToI = players[i].win;
HashSet<Integer> copyLoseToI = new HashSet<>(loseToI);
HashSet<Integer> copyWinToI = new HashSet<>(winToI);
for (Integer loseP : copyLoseToI) {
if (players[loseP].lose != null) {
loseToI.addAll(players[loseP].lose);
}
}
for (Integer winP : copyWinToI) {
if (players[winP].win != null) {
winToI.addAll(players[winP].win);
}
}
}
for (Player player : players) {
HashSet<Integer> win = player.win;
HashSet<Integer> lose = player.lose;
if (win.size() + lose.size() == n - 1) {
answer++;
}
}
return answer;
}
private static class Player {
private HashSet<Integer> win;
private HashSet<Integer> lose;
public Player(HashSet<Integer> win, HashSet<Integer> lose) {
this.win = win;
this.lose = lose;
}
}
}
Player[]
의 인덱스를 1~n
과 n~1
을 똑같은 로직으로 접근하는 방법을 사용했다.