문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
제한 사항
- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
입출력 예
n lost reserve return5 | [2, 4] | [1, 3, 5] | 5 |
5 | [2, 4] | [3] | 4 |
3 | [3] | [1] | 2 |
진짜 테스트 케이스 설명이 개 불친절한 문제였다....
1. lost 와 reserve배열이 더 큰 수가 앞에 올 수도 있다.. ex) [4,2] -> 정렬시켜줘야 한다..
2. lost와 reserve 값이 중복 가능하다 즉 여벌 체육복이 있는 사람도 도난당할 수 있다는 뜻!
2번째는 문제에 나와있지만 내가 제대로 안 읽었던... 큼
진짜 저 정렬 테스트 케이스 때문에 몇 시간을 날렸다... 이런 건 말 안 해줬잖아.. 암튼...
문제풀이
import java.util.Arrays;
public class PRO_CT_5 {
public static int solution(int n, int[] lost, int[] reserve) {
Arrays.sort(lost); //정렬시켜주기
Arrays.sort(reserve); //정렬시켜주기
int answer = 0;
int lostIdx =0;
int reserveIdx=0;
int[] arr = new int[n];
Arrays.fill(arr,1);//기본1로 채우고 lost면 -1 reserve면 +1 시켜줄거다
//1. 여벌옷있을시 2, 기본 1, 도난 당했을시 0 으로 배열을 채워준다
for(int i=1;i<=n;i++){
if(i==reserve[reserveIdx]){
arr[i-1]++; //+1해준다
if(reserveIdx<reserve.length-1)reserveIdx++; //이거안해주면 index에러나용
}
if(i==lost[lostIdx]){
arr[i-1]--; //-1해준다
if(lostIdx<lost.length-1) lostIdx++;
}
}
//2.나 자신이2이고 양옆들이 0일때만 나는-1 옆은+1 해준다
for(int i=0;i<n;i++){
if(i==0){// 0번 index일땐 바로앞만 비교해줌
if(arr[i]==2&&arr[i+1]==0){
arr[i]--;
arr[i+1]++;
}
}
if (i==n-1){ //마지막 index일땐 바로전만 비교해줌
if(arr[i]==2&&arr[i-1]==0){
arr[i]--;
arr[i-1]++;
}
}
if(i>0&&i<n-1){ //아니라면 나의 왼쪽부터 비교해줌
if(arr[i]==2&&arr[i-1]==0){
arr[i]--;
arr[i-1]++;
}
if(arr[i]==2&&arr[i+1]==0){ //다음 오른쪽비교
arr[i]--;
arr[i+1]++;
}
}
}
//3.최종계산
for(int i=0;i<arr.length;i++){
if(arr[i]>0) answer++; //최종배열에서 0보다 클때만 answer++해준다
}
return answer;
}
public static void main(String[] args) {
int n=5;
int[] lost = {4,2};
int[] reserve = {3,5};
System.out.println(solution(n,lost,reserve));
}
}
1번 상황에서 배열에 직접 0,1,2를 안 넣고 기본 1로 넣어 상황마다 ++, -- 해주는 이유는
도난당한 사람과 여벌 옷이 있는 사람이 겹칠 수 있기때문!
2번 상황에서 나의 왼쪽부터 비교를 해줘야 한다 안 그러면 안 되는 경우가 있기때문!
로직은 쉬웠는데... 테스트 케이스 설명 부족으로 시간 겁나 끌고 실패도 많이 했다..
진짜 sort 시켜주는걸 마지막에 알아서.. 휴..🥹
아무튼 통과!
'알고리즘🤮 > 프로그래머스' 카테고리의 다른 글
[JAVA] 프로그래머스 LEVEL1: 푸드 파이트 대회 (0) | 2022.12.22 |
---|---|
[JAVA] 프로그래머스 LEVEL1: 크레인 인형뽑기 게임 (0) | 2022.12.21 |
[JAVA]프로그래머스 LEVEL1: [1차] 다트게임 (1) | 2022.12.19 |
[JAVA]프로그래머스 LEVEL1: 실패율 (0) | 2022.12.17 |
[JAVA]프로그래머스 LEVEL1: 콜라문제 (0) | 2022.12.15 |