[Programmers] 그리디 - 체육복

문제

풀이

코드제출 시 5번과 12번이 실패로 떠서 문제에 제시된 제한사항과 다른 분들의 힌트를 보고 문제점을 알기까지 애를 먹었다.

체육복을 도난당한 학생이 여유분의 체육복을 가진 경우를 완벽하게 잡아내지 못했던 것 같다.

그래서 테스트케이스 1건을 추가했다.

solution(5, [2,3], [3,4])

lost와 reserve에 중복으로 존재하는 학생이 있을 경우에는 배열에 임의의 수 -99를 넣어 후에 체육복을 분배 시 제외하도록 하였더니 통과하였다...

채점결과에 실패한 테스트케이스를 알 수가 없어 갈피잡는데 오랜 시간이 걸린 것 같다...

제출답안

import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n - lost.length;
        int[] boolArray = new int[reserve.length];  // 여분 체육복이 한사람에게만 갈 수 있도록
        
        //정렬이 안되어있을경우
        Arrays.sort(lost);
        Arrays.sort(reserve);

        //도난당한 학생이 여벌의 체육복을 가져온 학생인 경우
        for(int i=0; i<reserve.length; i++){
            for(int j=0; j<lost.length; j++){
                if(lost[j] == -99 && reserve[i] == -99){
                    continue;
                }
                
                if(lost[j] == reserve[i]){
                    lost[j] = -99;
                    reserve[i] = -99;
                    answer++;
                }
            }
        }

        //중복제거 후 체육복 분배 및 체육수업에 참가할 수 있는 학생 수 카운트        
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(boolArray[j] == 0){
                    if(lost[i] == reserve[j]+1 || lost[i] == reserve[j]-1){
                        answer++;
                        boolArray[j] = 1;
                        break;
                    }
                }
            }
        }
        
        return answer;
    }
}

출처

Programmers

좋은 웹페이지 즐겨찾기