
가. 문제 설명
앞뒤사람에게 체육복을 주는 문제이다.
나. 접근 방법
그리디하게 접근하였다. 어떻게 그리디하냐면 일단 먼저 체육복을 줄 수 있는 사람을 찾고 왼쪽에 줄 수 있으면 주고 안되면 오른쪽에주고, 오른쪽에도 못주면 패스, 이런식 으로 해결하였다.
다. 문제 유형
그리디
import java.util.*;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int[] arr = new int[n+1];
int cnt=0;
for (int i=1; i<arr.length; i++){
arr[i]=1;
}
for (int i : lost){ // i : 체육복 잃어버린 친구들 번호
arr[i]-=1;
}
for (int j : reserve) { // j : 체육복 여분 갖고 있는 친구들 번호
arr[j]+=1;
}
for (int i=1; i<arr.length; i++){
if(arr[i]==2){ // 현재 줄 수 있는 친구면(arr[i]==2) 주고 빼기 아니면 패스
if(i-1>=1 && arr[i-1]==0){ // 왼쪽 줄 수 있는지 : i-1>=1 and arr[i-1]==0 -> arr[i-1] +=1
arr[i-1]+=1; // 줬다면 arr[i]-=1
arr[i]-=1;
}
else{ // 주지 못했다면 오른쪽 체크
if(i+1<arr.length && arr[i+1]==0){ // 오른쪽 줄 수 있는지 : i+1 <arr.length and arr[i+1]==0 -> arr[i+1] +=1
arr[i+1]+=1; // 줬다면 arr[i]-=1
arr[i]-=1;
}
}
}
// 줄수 없다면 pass
}
// arr[1~마지막]까지 0이 아닌 사람들 count 해서 return
for (int i=1; i<arr.length; i++){
if(arr[i] != 0){
cnt++;
}
}
return cnt;
}
}
걸린 시간은 40분으로 난이도 별 두개짜리 문제라고한다. 조금 더 시간 측정하는 것을 신경쓰고 노트에 잘 필기하는 방법을 고려해야겠다.