본문 바로가기

프로그래머스 풀이/Lv 1

[프로그래머스 JAVA] 체육복

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42862?language=java#

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

레벨1 중에선 어려운 편에 속하는 체육복 문제.

Greedy 문제로 번호가 작은 학생이 먼저 빌릴 수 있는 체육복이 있다면 빌리는 것이 최적이라는 것을 파악해야한다.

 

빠른 순서의 학생들이 먼저 빌려도 되는 이유는 양쪽에서 빌릴 수 있기 때문에 후에 학생들은 반드시 오른쪽에서는 빌릴 수 있는 1번의 기회가 존재하기 때문이다.

 

정답 코드

import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int reserveChk[] = new int[n + 2];
        
        Arrays.fill(reserveChk, 1);

        for(int i = 0; i < reserve.length; i++) {
            reserveChk[reserve[i]]++;
        }
        
        for(int i = 0; i < lost.length; i++) {
            reserveChk[lost[i]]--;
        }
        
        for(int i = 1; i <= n; i++) {
            if(reserveChk[i] == 0) {
                if(reserveChk[i - 1] > 1) {
                reserveChk[i]++;
                reserveChk[i - 1]--;
                } 
            
                else if(reserveChk[i + 1] > 1) {
                    reserveChk[i]++;
                    reserveChk[i + 1]--;
                }
            }
            
            
        }
        
        int answer = 0;
        for(int i = 1; i <= n; i++) {
            if(reserveChk[i] > 0) {
                answer++;
            }
        }
        return answer;
    }
}