[탐욕법] 체육복

서은경·2022년 5월 19일
0

CodingTest

목록 보기
17/71

public static int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;

        Arrays.sort(reserve);
        Arrays.sort(lost);

        HashSet<Integer> set = new HashSet<>();
        Queue<Integer> rq = new LinkedList<>();
        Queue<Integer> lq = new LinkedList<>();
        Queue<Integer> dq = new LinkedList<>();

        int cnt = reserve.length;

        for (int l : lost) {
            set.add(l);
            lq.add(l);
        }
        for (int r : reserve) {
            set.add(r);
            rq.add(r);

            if (lq.contains(r)) {
                lq.remove(r);
                rq.remove(r);
                dq.add(r);
            }
        }

        System.out.println(lq.size()+" "+rq.size());

        for (int r : reserve) {

            if (dq.contains(r)) {
                continue;
            }

            int idx = 0;
            while (idx < lq.size()) {
                if (lq.isEmpty()) {
                    break;
                }
                int max = r+1;
                int min = r-1;

                int l = lq.poll();

                if (l == max || l == min) {
                    System.out.println(r+"번 학생이 "+l+"번 학생에게 옷 빌려줌");
                    lq.remove(l);
                    cnt++;
                    break;
                } else {
                    lq.add(l);
                }

                idx ++;
            }
        }

        int s_cnt = n- set.size();      // 체육수업 무조건 듣는 학생 수
        System.out.println(s_cnt+" + "+cnt);
        answer = s_cnt + cnt;

        return answer;
    }

테스트 케이스 이거 통과하면 저게 안되고 저거 통과하면 이게 안되고 해서 꽤 오래 시간 붙잡은 문제..
각각 큐에 담고 중복인 값은 따로 빼서 저장해놓았다 그리고 반복문을 돌려서 빌려줄 수 있으면 카운팅을 올리고 큐에서는 빼줬다 중복인 애들은 이미 처음에 카운팅 됐으니까 continue로 넘겨주고 확실히 체육수업을 듣는 애들과 합쳐서 리턴!
set은 딱 자기 체육복만 가져온 애들 수를 구하려고 사용했다 배운건 바로바로 써먹기 ~!!

0개의 댓글

관련 채용 정보