[프로그래머스,Level 1] 체육복(JAVA 구현)
코테/프로그래머스(Programmers)

[프로그래머스,Level 1] 체육복(JAVA 구현)

반응형

- 첫 풀이 및 정답풀이

  이 문제는 특별한 알고리즘보다는 그냥 있는 조건에 맞게 코딩하면 풀 수 있는 문제이다. 필자는 체육복 개수를 카운팅 하는 1차원 배열을 n+2 크기만큼 선언해 주었다. 그 이유는 기본적으로 체육복을 앞, 뒤 사람에게만 빌릴 수 있는데 이를 구현하는 과정에서 인덱스 범위 에러와 코드 자체가 복잡하다고 생각되어서 이다. 자세한 풀이는 코드를 통해 확인하자.

 

import java.util.Arrays;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n;
        // 1. 체육복 개수 배열.
        int check[] = new int[n+2];
        // 2. 체육복이 없는 학생 수.
        int temp = 0;
        // 3. 초기 모든 학생의 체육복은 1개.
        Arrays.fill(check,1);
        // 4. 체육복을 잃어버린 학생들의 체육복은 0개.
        for(int i =0;i<lost.length;i++){
            check[lost[i]]--;
        }
        // 5. 여벌 체육복이 있는 학생들의 체육복은 2개.
        for(int i =0;i<reserve.length;i++){
            check[reserve[i]]++;
        }
        // 6. 1번 학생부터 n번 학생까지 반복.
        for(int i =1;i<=n;i++){
            // 6-1. 체육복이 있는 학생은 넘어간다.
            if(check[i] > 0) continue;
            // 6-2. 체육복이 없는 학생의 앞, 뒤 학생들의 인덱스 범위가 안 벗어날 때.
            if(i-1>=0 || i+1<check.length){
                // 6-3. 앞 학생에게 체육복을 빌린다.
                if(check[i-1] > 1){
                    check[i-1]--;
                    check[i]++;
                // 6-4. 뒤 학생에게 체육복을 빌린다.    
                }else if(check[i+1] > 1){
                    check[i+1]--;
                    check[i]++;
                }
            }
            // 6-5. 모두 빌렸지만 체육복이 없는 학생들의 수를 증가.
            if(check[i] == 0) temp++;
        }
        
        return (answer-temp);
    }
}
반응형