https://programmers.co.kr/learn/courses/30/lessons/42862
- 우선 보기 쉽게 배열을 한 칸 더 선언해서 학생 번호를 보기 쉽게 선언하였다.
첫번째 학생은 값 변동이 없으므로 0값(본인 체육복만 있는 학생)이 들어오기도 하고 for문을 1번 부터 돌려 0번을 스킵한다.- students배열에 lost 값에 해당하는 학생은 감소(--)를, reserve 값에 해당하는 학생은 증가(++)를 하여
체육복을 잃어버린 학생(-1) / 본인 체육복만 있는 학생(0) /여벌 체육복이 있는 학생(1)으로 표현- 학생 번호를 하나씩 확인하며 체육복을 잃어버린 학생(-1)값에 해당하면 앞 또는 뒷 번호가 여분이 있는 학생(1)인지 확인하고 있다면 해당 두 학생 모두 본인 체육복만 있는 학생(0)으로 수정한다.
- 본인 앞의 학생이 여분 체육복이 있으면 문제가 없지만 / for문의 인덱스(i)가 마지막 번호 보다 작을 때 (그래야 뒷자리에 누군가가 있기 때문에 / 마지막 학생에 +1을 하면 인덱스 초과 오류 발생) 뒤에 학생이 여분이 있으면 체육복을 빌린다.
- 마지막 학생은 자동으로 앞에 학생을 보고 체육복을 대여 여부를 결정.
- for문을 통해 students배열 요소에 0보다 큰 수(본인 또는 본인과 여분 옷이 있는 경우)인 경우를 카운트 해주어 그 값을 리턴.
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
int[] students = new int[n+1];
//-1 :체육복을 놓고 온 학생
// 0 :체육복 본인꺼만 있는 학생
// 1 :여벌의 체육복을 챙긴 학생
for(int l : lost) {
students[l]--;
}
for(int r : reserve) {
students[r]++;
}
for(int i=1; i<students.length-1; i++) {
if(students[i] == -1) {
if(students[i - 1] == 1) {
students[i] = 0;
students[i - 1] = 0;
}
else if(i < students.length-1 && students[i + 1] == 1) {
students[i] = 0;
students[i + 1] = 0;
}
}
}
for(int i=1; i<students.length; i++) {
if(students[i] >= 0) {
answer++;
}
}
return answer;
}
}