특정한 알고리즘으로 풀기 보다는 조건을 따지면서 푸는 문제였다.
일일이 확인을 해야 하는 문제이기에 여기서는 자료구조가 중요했는데, ArrayList에도 필요한 기능이 있긴 하지만 Set이 해당 기능을 가지고 있으며 시간도 더 빨라 Set을 사용했다.
중요한 건 조건을 잘 따져줘야 한다는 거다.
나는 초반에 두 번 이상 졌던 참가자가 one_lost에 들어가 있는 문제를 확인했다. 이는 두 번 이상 지면 one_lost에 값을 지우고 lost에 넣어주는데, 두 번 이상 졌다고 확인하는 방법으로 !one_lost.contains()만을 썼기 때문이다. 이렇게 되면 두 번 이상 져서 one_lost에서 지워지고 lost에서 들어간 참가자가 one_lost에 중복되어 들어가는 문제가 생긴다. 그러므로 one_lost에 존재하는지 확인하고 lost에 존재하는지 확인해서 lost에 존재한다면 두 번 이상 졌다는 의미이니 one_lost에 해당 값을 넣어서는 안 된다.
class Solution {
public List<List<Integer>> findWinners(int[][] matches) {
HashSet<Integer> win = new HashSet<>();
HashSet<Integer> one_lost = new HashSet<>();
HashSet<Integer> lost = new HashSet<>();
List<List<Integer>> answer = Arrays.asList(new ArrayList<>(), new ArrayList<>());
for(int i=0; i<matches.length; i++){
int[] tmp = matches[i];
int winner = tmp[0];
int loser = tmp[1];
if(win.contains(loser)){
win.remove(loser);
}
if(!one_lost.contains(winner) && !lost.contains(winner)){
win.add(winner);
}
if(!one_lost.contains(loser)){
//문제 헤결을 위해 추가 된 코드
//해당 코드가 없으면 lost에 들어간 값이 one_lost에 들어가는 문제가 생긴다.
if(lost.contains(loser)){
continue;
}
one_lost.add(loser);
}else{
one_lost.remove(loser);
lost.add(loser);
}
}
answer.get(0).addAll(win);
answer.get(1).addAll(one_lost);
Collections.sort(answer.get(0));
Collections.sort(answer.get(1));
return answer;
}
}