알고리즘

[프로그래머스 lv 1] 체육복.java

파뱁 2022. 4. 8. 23:21
728x90

<문제 설명>

https://programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

최종적으로 체육수업을 들을 수 있는(체육복이 있는) 학생의 수를 구하면 된다. 여벌 체육복이 있는 학생은 체육복을 도난 맞은 학생에게 빌려줄 수 있는데, 이때 자신의 앞, 뒤 번호를 가진 학생에게만 빌려줄 수 있다.

(여벌 체육복이 있는 학생이 도둑맞았다면 다른 학생에게 빌려줄 수 없다.)

 

입출력의 예는 다음과 같다.

n lost reserve return
5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2

 

<문제 풀이 아이디어>

도둑 맞지 않은 학생의 수를 먼저 계산해서 최소한 수업을 들을 수 있는 인원을 계산해둔다. 이후 잃어버린 학생과 여벌 체육복을 가지고 있는 학생의 리스트를 번호를 기준으로 정렬하고 시작한다.

 

다음의 2가지 경우를 계산한다.

첫번째는 여벌 체육복을 가져온 학생이 도난당하는 경우이다. 이 경우 인원의 변동이 생기진 않지만(도난당한 인원에서 제하고 수업 가능 인원을 추가한다.), 다른 학생에게 체육복을 빌려줄 수 없기 때문에 여벌 체육복이 있는 학생의 리스트에서 제한다.

두번째는 여벌 체육복이 있는 학생이 없는 학생에게 빌려줄 경우이다. 이미 앞에서 여벌체육복이 있지만 도난당한 학생을 제하였기 때문에 단순히 여벌 체육복이 있는 학생 기준 앞, 뒷 번호에 도난당한 학생이 있을 경우 해당학생에게 빌려줬기 때문에 수업 가능인원을 늘리고, 여벌 체육복이 없는 상태로 만든다.

 

최종적으로 수업 가능 인원을 리턴하면 된다.

 

<문제 풀이 코드>

import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        //최소한 수업들을 수 있는 인원
        int answer = n - lost.length;
        
        //일단 정렬하고 시작
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        // 여벌 체육복을 가져온 학생이 도난당한 경우
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] == reserve[j]){
                    answer++;
                    lost[i] = -1;
                    reserve[j] = -1; 
                    break; 
                }
            }
        }
        // 도난당한 학생에게 체육복 빌려주는 경우
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if((lost[i]-1 == reserve[j]) || (lost[i]+1 == reserve[j])){
                    answer++;
                    reserve[j] = -1; 
                    break; 
                }
            }
        }
        return answer;
    }
}

채점 결과

 

728x90
반응형