🔑 해결
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓삾을 return 하도록 solution함수를 작성하는 문제이다.
lost와 reserve 배열을 정렬한 다음 체육복이 있거나 빌릴 수 있는 학생들(체육복을 도난 당하지 않은 학생, 도난당했지만 예비로 들고 온 학생, 도난당했지만 체육복을 빌릴 수 있는 학생)을 answer에 더한다.
- reserve, lost 배열 정렬
- 전체에서 도난 당한 학생 수를 빼서(n - lost.length) 도난 당하지 않은 학생 수를 answer에 더한다.
- lost배열과 reserve배열에 둘다 있는 학생은 본인 체육복은 있지만 빌려줄 수 없다.
3-1. 체육복이 있어 체육수업을 들을 수 있는 학생이므로 answer++
3-2. 다른 학생에게 체육복을 빌릴 필요가 없으므로 lost[i]에 상관없는 값 -1 저장.
3-3. 다른 학생에게 빌려줄 수 없으므로 reserve[i]에 상관없는 값 -1 저장.
3-4. 이후의 for문을 돌 필요 없으므로 break - 체육복을 앞뒤 번호 학생에게만 빌려줄 수 있다. (lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j])
4-1. 체육복을 빌렸다면 answer++
4-2. 체육복을 빌려줬으므로 reserve[j]에 -1 저장
4-3. 더이상의 for문을 돌 필요 없으므로 break
🔓 코드
import java.util.Arrays;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
Arrays.sort(reserve);
Arrays.sort(lost);
// 도난 당하지 않은 학생 수
answer = n - lost.length;
// 여벌 체육복을 가져왔지만 도난당한 학생 수
// 다른 학생에게 체육복을 빌려줄 수 없음
for (int i = 0; i < lost.length; i++) {
for (int j = 0; j < reserve.length; j++) {
if (lost[i] == reserve[j]) {
answer++;
lost[i] = -1;
reserve[j] = -1;
break;
}
}
}
// 도난당했지만 체육복을 빌릴 수 있는 학생 수
for (int i = 0; i < lost.length; i++) {
for (int j = 0; j < reserve.length; j++) {
if (lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j]) {
answer++;
reserve[j] = -1;
break;
}
}
}
return answer;
}
}
'알고리즘 테스트 공부' 카테고리의 다른 글
K번째수 (0) | 2023.10.09 |
---|---|
모의고사 (0) | 2023.10.08 |
실패율 (0) | 2023.10.06 |
크레인 인형뽑기 게임 (0) | 2023.10.05 |
[카카오 인턴] 키패드 누르기 (0) | 2023.10.04 |