알고리즘 문제풀이/자바

[프로그래머스-그리디] 체육복 JAVA 자바

Ella_K 2022. 11. 21. 07:39

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

👉 풀이

  • 최대한 많은 학생이 체육 수업을 듣게 하기 위해서는 적은 번호를 가진 학생끼리 먼저 체육복을 빌려주고 빌려야 한다. 따라서 lost, reserve 배열 오름차순 정렬한다. 정렬 후 체육복을 빌려주기 위해 배열 탐색
  • 탐색 전 여분의 체육복이 있는 사람의 체육복이 도난 당했을 경우, 여분의 체육복을 다른 사람에게 빌려줄 수 없으므로 -1 값을 대입해 필터링한다.
  • lost와 reserve를 순차적으로 탐색하면서 조건에 만족하면 체육복을 reserve가 lost에게 체육복을 빌려준다. 체육복을 빌려준 경우 다음 탐색에서 제외되기 위해 reserve에 -1을 대입한다.
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n - lost.length;

        // 최대한 많은 학생이 체육수업을 듣게 할려면 정렬을 해야한다.
        /*
        ex.
        lost = {2,4,5,6}
        reserve = {3,1}
        * */
        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 += 1;
                    lost[i] = -1;
                    reserve[j] = -1;
                    break; // 다음 lost로 넘어가야 함
                }
            }
        }

        for(int i = 0; i < lost.length; i++){
            for(int j = 0; j < reserve.length; j++){
                if(lost[i] == reserve[j]-1 || lost[i] == reserve[j]+1){
                    answer += 1;
                    reserve[j] = -1;
                    break; // 다음 lost로 넘어가야 함
                }
            }
        }

        return answer;
    }
※ 주의
최대한 많은 학생이 체육 수업을 듣게 하기 위해서 lost, reserve 배열을 오름차순 정렬하고 탐색을 해야한다.

예를 들어
lost = {2,4,5,6}
reserve = {3,1}
체육수업을 많은 학생이 듣기 위해서 2번이 1번의 체육복을, 4번이 3번의 체육복을 빌려야 한다.
그러나 배열이 정렬되어 있지 않으면, 2번이 3번의 여벌 체육복을 먼저 빌리게 되어 4번이 체육복을 빌릴 수 없다.
적은 번호를 가진 학생이 먼저 체육복을 빌려주어야 한다.