문제
해결 방향 고민
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열을 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어졌을 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 하는 solution 함수를 작성하는 문제이다.
lost와 reserve 배열을 정렬한 다음 체육복이 있거나 빌릴 수 있는 학생들을 answer에 더한다.
•
체육복이 있거나 빌릴 수 있는 학생들
◦
체육복을 도난 당하지 않은 학생
◦
체육복을 도난 당했으나 예비로 들고 온 학생
◦
체육복을 도난 당했으나 체육복을 빌릴 수 있는 학생
해결 방법
1.
reserve, lost 배열을 정렬한다.
2.
전체에서 도난 당한 학생 수를 뺀 다음(n - lost.length) 도난 당하지 않은 학생 수를 answer 에 더한다.
3.
lost 배열과 reserve 배열에 둘 다 있는 학생은 본인 체육복은 있지만 빌려줄 수 없음을 참고한다.
(둘 중에 하나만 있으라는 법은 없으므로)
a.
체육복이 있어 체육수업을 들을 수 있는 학생: answer++;
b.
다른 학생에게 체육복을 빌릴 필요가 없으므로 lost[i]에 상관없는 값 -1 저장
c.
다른 학생에게 빌려줄 수 없으므로 reserve[i]에 상관없는 값 -1 저장
d.
이후의 for문을 돌 필요가 없으므로 break
4.
체육복을 앞뒤 번호 학생에게만 빌려줄 수 있다.
(lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j])
a.
체육복을 빌렸다면: answer++;
b.
체육복을 빌려줬으므로 reserve[j]에 -1 저장
c.
더 이상의 for문을 돌 필요가 없으므로 break
코드
package algo250129;
import java.util.Arrays;
// 체육복 - Lv1
public class Pro42862 {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
Arrays.sort(lost);
Arrays.sort(reserve);
// 도난 당하지 않은 학생의 수
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 k : lost) {
for (int j = 0; j < reserve.length; j++) {
if (k - 1 == reserve[j] || k + 1 == reserve[j]) {
answer++;
reserve[j] = -1;
break;
}
}
}
return answer;
}
}
Java
복사