[프로그래머스] 체육복 (Lv.1)
문제
점심시간에 도둑이 들어 일부 학생이 체육복을 도난당했다.
다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 한다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있다.
예를 들어, 3번 학생은 2번 학생이나 4번 학생에게만 체육복을 빌려줄 수 있다. 체육복이 없으면 수업을 들을 수 없으므로 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들을 수 있도록 해야 한다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성하라.
단,
- 전체 학생의 수는 2명 이상 30명 이하
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하, 중복되는 번호 없음
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하, 중복되는 번호 없음
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있음
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있음. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이므로 다른 학생에게는 체육복을 빌려줄 수 없음
나의 답안
- lost배열 및 reserve배열 오름차순 정렬
- 수업을 들을 수 없는 학생을 세기 위한 count 변수 생성
- 도난당한 학생 중 여벌 체육복이 있는 경우, 본인 체육복을 입도록 우선 제거
이후 해당 학생 번호를 -1로 변경하여 중복 방지 - 잃어버린 학생 번호의 앞 뒤 번호 학생 중 여벌 옷을 가져온 학생이 있을 경우
count변수 1 감소 및 빌려준 학생 번호를 -1로 변경
import java.util.*;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
Arrays.sort(lost);
Arrays.sort(reserve);
int count = lost.length;
for (int i=0; i<lost.length; i++) {
int a = lost[i];
for (int j = 0; j < reserve.length; j++) {
if (reserve[j] == a) {
reserve[j] = -1;
lost[i] = -1;
count--;
break;
}
}
}
for (int i=0; i<lost.length; i++) {
int a = lost[i];
for (int j=0; j<reserve.length; j++) {
if (reserve[j] == a-1) {
reserve[j] = -1;
count--;
break;
} else if (reserve[j] == a+1) {
reserve[j] = -1;
count--;
break;
}
}
}
return n-count;
}
}
모범 답안
- 크기가 n인 people변수 생성 (인덱스 0부터 학생 1번에 해당)
- 도난당한 학생 및 여벌 옷 있는 학생 번호에 해당하는 people 인덱스 값에 각각 -1, +1 해줌
(위 과정에서 여벌옷이 있으면서 도난당한 학생은 자동으로 처리됨) - 1번 학생(people[0])부터, 앞 뒤 번호에 여벌옷이 있는 경우 즉, +1값인 경우 옷을 빌림
- 해당하지 않으면 answer -1
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int[] people = new int[n]; //크기가 n인 people변수 생성 (인덱스 0부터 학생 1번에 해당)
int answer = n;
for (int l : lost)
people[l-1]--; //도난당한 학생 위치의 값 -1
for (int r : reserve)
people[r-1]++; //여벌 옷 있는 학생 위치의 값 +1
for (int i = 0; i < people.length; i++) {
if(people[i] == -1) {
if(i-1>=0 && people[i-1] == 1) {
people[i]++;
people[i-1]--;
}else if(i+1< people.length && people[i+1] == 1) {
people[i]++;
people[i+1]--; // 앞 뒤 학생 중 여벌 옷이 있을 경우 빌림
}else
answer--; // 없을 경우 수업을 들을 수 없으므로 answer -1
}
}
return answer;
}
}
- 변수를 새로 생성해줌으로써 도난당한 학생 중 여벌 옷이 있는 학생을 거를 수 있음
- 그에 더하여 for문을 간소화하고 이중 for문 사용을 하지 않아 훨씬 효율적이다.
복습
★크기를 지정하여 정수 배열을 선언할 경우, 기본 값은 0
int[] arr = new int[5];
for (int a : arr)
System.out.print(a); // 출력 : 00000