코딩테스트 고득점 Kit_탐욕법(Greedy)
🔥 체육복 🔥
탐욕법 알고리즘에 대한 설명은 다른 post 참고!
점심시간에 도둑이 들어서 일부 학생들의 체육복을 도난당했다.
여벌이 있는 학생들이 이들에게 체육복을 빌려주려하는데 학생들의 번호는 체격순으로 매겨져 있어 바로 앞과 뒷번호의 학생들에게만 체육복을 빌려줄 수 있습니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reverse가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return하도록 solution을 완성해보자
n | lost | reserve | return |
---|---|---|---|
5 | [2,4] | [1,3,5] | 5 |
5 | [2,4] | [3] | 4 |
3 | [3] | [1] | 2 |
import java.util.*;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = n;
answer = n-lost.length;
//도난당했지만 여분이 있는 경우
for(int i=0;i<lost.length;i++){
for(int j=0;j<reserve.length;j++){
//System.out.println(lost[i]+"와 "+reserve[j]);
if(lost[i] == reserve[j]){
reserve[j] = -1;
lost[i] = -1;
answer = answer+1;
//도난당했지만 여분이 있는 학생은 빌려줄수 없지만 체육시간에 참여가능하니까 제외
System.out.println(lost[i]+"와 "+reserve[j]);
}
}
}
//reserve에 있는 학생들의 앞뒤번호 학생이 lost에 있다면
for(int i=0;i<lost.length;i++){
for(int j=0;j<reserve.length;j++){
if(lost[i] != -1 && reserve[j] !=-1){
if(lost[i] == reserve[j]-1 || lost[i] == reserve[j]+1){
System.out.println(lost[i]+"가 "+reserve[j]+"꺼를 빌려");
lost[i] = -1;
reserve[j] = -1;
answer +=1;
}
}
}
}
return answer;
}
}
처음에는 lost와 reserve가 정렬되어있지 않을 것이라고는 생각하지 못해서 정렬을 하지 않고 코드를 작성해서 실패가 발생했다.
import java.util.*;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
Arrays.sort(lost);
Arrays.sort(reserve);
int answer = n-lost.length;
//도난당했지만 여분이 있는 경우
for(int i=0;i<lost.length;i++){
for(int j=0;j<reserve.length;j++){
//System.out.println(lost[i]+"와 "+reserve[j]);
if(lost[i] == reserve[j]){
reserve[j] = -1;
lost[i] = -1;
answer = answer+1;
//도난당했지만 여분이 있는 학생은 빌려줄수 없지만 체육시간에 참여가능하니까 제외
System.out.println(lost[i]+"와 "+reserve[j]);
}
}
}
//reserve에 있는 학생들의 앞뒤번호 학생이 lost에 있다면
for(int i=0;i<lost.length;i++){
for(int j=0;j<reserve.length;j++){
if(lost[i] != -1 && reserve[j] !=-1){
if(lost[i] == reserve[j]-1 || lost[i] == reserve[j]+1){
System.out.println(lost[i]+"가 "+reserve[j]+"꺼를 빌려");
lost[i] = -1;
reserve[j] = -1;
answer +=1;
}
}
}
}
return answer;
}
}
체육복 도둑질 하지 마세요