
문제링크: 2225. Find Players With Zero or One Losses
정수로 표시되는 승자, 패자[winner, loser]로 이루어진 이차원 배열 matches를 입력 받았을 때 주어진 조건을 만족하는 배열을 반환하시오.
매치에 포함되어 있는 플래이어 정보와 대전 정보를 알맞은 자료구조에 넣어서 연산을 진행하는 것이 중요하다 생각했다. player를 저장하는 곳은 중복을 혀용할 필요 없고 순서도 상관없으니 Set구조가 알맞다 생각했고 한 번만 패배하는 player를 저장하는 곳도 똑같이 생각했다. 단 패배하는 player를 저장하는 곳은 최소 2번의 패배 이상을 기록 할 수 있어야 의미가 있으므로 List를 사용하였다.
코드:
class Solution {
public List<List<Integer>> findWinners(int[][] matches) {
Set<Integer> players = new HashSet<>();
Set<Integer> oneLoss = new HashSet<>();
List<Integer> losser = new ArrayList<>();
for(int[] i : matches){
players.add(i[0]);
players.add(i[1]);
losser.add(i[1]);
}
Collections.sort(losser);
ListIterator<Integer> it = losser.listIterator();
while(it.hasNext()){
int current = it.next();
players.remove(current);
if(oneLoss.remove(current)){
while(it.hasNext()){
int next = it.next();
if(next!=current){
next = it.previous();
break;
}
}
continue;
}
oneLoss.add(current);
}
List<List<Integer>> ans = new ArrayList<>();
ArrayList<Integer> playerList = new ArrayList<>(players);
ArrayList<Integer> LossList = new ArrayList<>(oneLoss);
Collections.sort(playerList);
Collections.sort(LossList);
ans.add(playerList);
ans.add(LossList);
return ans;
}
}
loss정보를 List로 대전 자체를 기록하기 보다는 Map을 활용하여 구현하면 더 깔끔하게 코드를 짤 수 있을 거 같다.