Backend
home
🥋

[프로그래머스] 체육복

생성일
2025/01/29 08:29
태그
Programmers
게시일
2025/01/29
최종 편집 일시
2025/02/01 07:45

문제

해결 방향 고민

전체 학생의 수 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
복사