프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제

제출한 코드
import java.util.Arrays;
class Solution {
public long solution(int n, int[] lost, int[] reserve) {
int[] student = new int[n+2];
student[0] = -1; student[n+1] = -1;
Arrays.sort(lost);
Arrays.sort(reserve);
// 잃어버린 학생 = 1 / 체육복이 있는 학생 = 0 / 배열의 맨앞뒤 = -1
for (int i = 0; i < lost.length; i++) {
student[lost[i]] = 1;
}
// 본인이 잃어버린 학생이라면 본인 체육복을 본인에게
for (int i = 0; i < reserve.length; i++) {
if (reserve[i] > 0 && student[reserve[i]] > 0) {
student[reserve[i]] = 0;
reserve[i] = -1;
}
}
for (int i = 0; i < reserve.length; i++) {
// 앞사람이 체육복이 없으면
if (reserve[i] > 0 && student[reserve[i]-1] > 0) {
student[reserve[i]-1] = 0;
reserve[i] = -1;
}
// 뒷사람이 체육복이 없으면
if (reserve[i] > 0 && student[reserve[i]+1] > 0) {
student[reserve[i]+1] = 0;
reserve[i] = -1;
}
}
return Arrays.stream(student).filter(x -> x == 0).count();
}
}
풀이
먼저 체육복이 있는 학생과 없는 학생을 담기 위한 int 배열을 n + 2 사이즈로 student 라는 이름으로 선언하고,
맨앞의 인덱스와 맨뒤의 인덱스의 값을 -1로 초기화시켰다.
이 배열은 체육복이 없는 학생은 1, 체육복이 있는 학생은 0을 담을 예정이다.
이후 순차 탐색을 위해 배열 lost와 reserve를 오름차순으로 정렬했다.
lost 배열 안의 값은 체육복이 없는 학생을 뜻하기 때문에, 해당 student 인덱스의 값을 1로 변경해준다.
이 문제는 특히 아래의 조건을 잘 읽어봐야 한다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
따라서 본인 체육복을 본인이 사용해야 하는 경우가 있기 때문에, 먼저 for문을 돌려서 이 케이스에 해당하는 인덱스는 0(체육복이 있음)으로 바꾸고, 더 이상 다른 사람에게 빌려줄 수 없으므로 reserve의 해당 인덱스의 값을 -1로 변경해주었다.
이후 비슷한 맥락으로 앞번호에게 빌려줄 수 있으면, student의 앞 인덱스의 값은 0으로, 해당 reserve의 인덱스 값은 -1로 변경했다.
마찬가지로 뒷번호에게도 동일하게 적용된다.
이후 student 배열 안에서 0의 개수를 count하여 반환하도록 했다.
이때 반환되는 타입은 long 타입이므로, 여기에 맞게 원래 프로그래머스 상에서 int로 반환 타입이 잡혀있던 것을 long 타입으로 변경해주었다.
'프로그래머스' 카테고리의 다른 글
| [프로그래머스] 131128번 - 숫자 짝꿍 [Java] (0) | 2026.06.08 |
|---|---|
| [프로그래머스] 133499번 - 옹알이 (2) [Java] (0) | 2026.06.05 |
| [프로그래머스] 77484번 - 로또의 최고 순위와 최저 순위 [Java] (0) | 2026.06.04 |
| [프로그래머스] 136798번 - 기사단원의 무기 [Java] (0) | 2026.06.02 |
| [프로그래머스] 159994번 - 카드 뭉치 [Java] (0) | 2026.05.22 |