leetcode 2225, Find Players With Zero or One Losses

NJW·2022년 11월 28일
0

코테

목록 보기
117/170

들어가는 말

특정한 알고리즘으로 풀기 보다는 조건을 따지면서 푸는 문제였다.
일일이 확인을 해야 하는 문제이기에 여기서는 자료구조가 중요했는데, 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;
    }
}
profile
https://jiwonna52.tistory.com/

0개의 댓글