[programmers]グリディ-スポーツウェア


質問する

に答える
コードの提出時に5番と12番に失敗を表示し、質問で提示された制限事項と他の人の提示を見て、問題の所在を知りました.
体育服を盗まれた学生は十分な運動服を出せない.
そのため、テストケースが1つ追加されました.
solution(5, [2,3], [3,4])
もしlossと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