https://programmers.co.kr/learn/courses/30/lessons/42862?language=java
문제 설명
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
(1) i = 2,4
people[i-1] -> n의 값은 5인데, 배열은 0부터 시작이니까 -1을 해준다.
뒤에 --를 해준 건 0이라고 지정해서 빌려줄 값이 없다고 생각
(2) j = 1,3,5
people[i-1] -> 똑같이 해당 인덱스값이 나오도록 -1을 해준다.
여벌을 가져온 학생들은 ++를 해서 1이라고 해놓기
(3) i를 0부터 people의 길이인 5까지 for문을 돌리는데,
people[i] == -1이면,
처음에 people의 초기값은 {0,0,0,0,0}인데 (1)과(2)의 과정을 통해서 people : {0, -1, 1, -1, 0} 된다.
여기서, people[i]값이 0이라는 건 즉, 체육복을 잃어버린 사람들을 의미한다.
(4) 여기서, 첫번째가 아니고(and) 내 앞사람이 1임을 알 수 있고, 여분을 가져온 사람이면 i번째 인간이 빌려와 0을 해주고 앞사람을 -1을 해준다.
(5) 내가 마지막 사람이 아니면서 내 뒷사람이 1이며, 뒷 사람한테 빌린다.
(6) 그리고 0인 값만 answer에 넣어줘서 출력한다.
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
int[] people = new int[n];
//(1)
for(int i: lost) {
people[i-1]--;
}
//(2)
for(int j: reserve) {
people[j-1]++;
}
for(int i=0; i<people.length;i++) {
//(3)
if(people[i] == -1) {
//(4)
if(i>0 && people[i-1] == 1) {
people[i]++;
people[i-1]--;
//(5)
}else if(i < people.length-1 && people[i+1] ==1) {
people[i]++;
people[i+1]--;
}
}
}
//(6)
for(int i : people) {
if(i == 0) {
answer++;
}
}
return answer;
}
}