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이란 무엇일까 ??
반복문에서 컬렉션이 반복되고 있는데, 컬렉션 요소에 대한 추가 및 삭제가 발생해서 생기는 예외 입니다.
'문제 풀이 > 프로그래머스 알고리즘' 카테고리의 다른 글
코딩 테스트 - 오답노트 (0) | 2024.11.12 |
---|---|
Arrays.sort() 메서드, 배열 정렬 (1) | 2024.11.09 |
특정 날짜(xxxx, xx, xx)의 요일 구하기 - LocalDate (0) | 2024.10.24 |
가장 가까운 같은 글자 (0) | 2024.10.17 |
문자열 내 마음대로 정렬하기 // Arrays.sort(), Comparator<T> (1) | 2024.10.14 |