문제 풀이/프로그래머스 알고리즘

체육복 + ConcurrentModificationException

열심히 해 2024. 11. 4. 11:09

https://school.programmers.co.kr/learn/courses/30/lessons/42862

 

 

처음에는 아래(오답)과 같이 작성했습니다 .

 

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        // 전체 학생의 수 n,
        // 체육복을 도난당한 학생들의 번호가 담긴 배열 lost,
        // 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve
        int answer = n - lost.length;

        Set<Integer> setLost = new HashSet<>();
        Set<Integer> setReserve = new HashSet<>();

        for (int r : reserve) {
            setReserve.add(r);
        }

        // 잃어버린 학생이 여벌 옷을 가져온 경우
        // 잃어버린 학생이 여벌 옷이 없을 경우
        for (int l : lost) {
            if (setReserve.contains(l)) {
                setReserve.remove(l);
                answer ++;
            } else {
                setLost.add(l);
            }
        }

        // 잃어버린 학생이 여벌 옷을 빌릴 수 있을 경우
        for (int l : setLost) {
            for (int r : setReserve) {
                if (l == r -1) {
                    answer++;
                    setLost.remove(l);
                    setReserve.remove(r);
                } else if (l == r+1) {
                    answer++;
                    setLost.remove(l);
                    setReserve.remove(r);
                }
            }
        }

        return answer;
    }
}

 

반복문 - for 문을 사용하는 와중에 반복문의 조건이 되는 setLost 와 setReserve  의 크기가 변하고 있습니다.

 

이럴 경우 **ConcurrentModificationException**가 발생할 수 있습니다. 

 

 

따라서 아래와 같이 수정했습니다.

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        // 전체 학생의 수 n,
        // 체육복을 도난당한 학생들의 번호가 담긴 배열 lost,
        // 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve
        int answer = n - lost.length;

        Set<Integer> setLost = new HashSet<>();
        Set<Integer> setReserve = new HashSet<>();

        for (int r : reserve) {
            setReserve.add(r);
        }

        // 잃어버린 학생이 여벌 옷을 가져온 경우
        // 잃어버린 학생이 여벌 옷이 없을 경우
        for (int l : lost) {
            if (setReserve.contains(l)) {
                setReserve.remove(l);
                answer ++;
            } else {
                setLost.add(l);
            }
        }

        // 잃어버린 학생이 여벌 옷을 빌릴 수 있을 경우
        for (int l : setLost) {
            if (setReserve.contains(l-1)) {
                answer++;
                setReserve.remove(l-1);
            } else if (setReserve.contains(l+1)) {
                answer++;
                setReserve.remove(l+1);
            }
        }

        return answer;
    }
}

 

위 코드에서 for문의 조건은 setLost 이고, 그 안에서는 setReserve 의 크기가 변동되고 있습니다. 

 

따라서 **ConcurrentModificationException**가 발생하지 않습니다.

 

 


 

 

 

ConcurrentModificationException이란 무엇일까 ??

 

반복문에서 컬렉션이 반복되고 있는데, 컬렉션 요소에 대한 추가 및 삭제가 발생해서 생기는 예외 입니다.