알고리즘 & 자료구조/문제 풀이
[프로그래머스 알고리즘 고득점 Kit][그리디][Java] 체육복
수수다
2026. 4. 30. 17:41
https://school.programmers.co.kr/learn/courses/30/lessons/42862
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
지금 나는 2벌을 가지고 있고
내 왼쪽이나 오른쪽에 한벌도 없다면 빌려준다.
모든 사람에 대해서 체육복을 왼쪽 기준을 먼저 다 체크해준다.
모든 사람을 왼쪽부터 왼쪽 친구 먼저 기준으로 둔 이유는
0 2 0 2 이렇게 있다면 0 1 1 2 이런 상황이 일어날 수 있기때문에
왼쪽 사람부터 왼쪽 친구에게 먼저인 방향을 정하고 진행했다.
반대로 오른쪽 사람부터 오른쪽 친구에게 먼저인 방향으로 풀어도 된다.
양 끝점 배열의 인덱스를 넘어가지 않게 하기위해 분리했더니 좀 복잡해졌다.
lost 와 reserve를 적용할 때 advanced for 를 쓰면 조금은 더 깔끔해질 것같다.
import java.util.*;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int[] have = new int[n+1];
Arrays.fill(have, 1);
for(int i=0; i<lost.length ; i++){
have[lost[i]]--;
}
for(int i=0; i<reserve.length ; i++){
have[reserve[i]]++;
}
for(int i=1; i<=n; i++){
if(i == 1 && have[1] == 2 && have[2] == 0) {
have[1]--;
have[2]++;
}
if(i < n && have[i] == 2) {
if(have[i-1] == 0) {
have[i]--;
have[i-1]++;
} else if(have[i+1] == 0) {
have[i]--;
have[i+1]++;
}
}
if(i == n && have[n] == 2 && have[n-1] == 0) {
have[n]--;
have[n-1]++;
}
}
int answer = 0;
for(int i=1; i<=n; i++) {
if(have[i] > 0) answer++;
}
return answer;
}
}