[프로그래머스] lv.1 체육복 (56%) 탐욕법(Greedy)

ayboori·2024년 8월 5일
0

Java Study

목록 보기
32/34

내가 작성한 풀이 - Set을 이용

import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n - lost.length; // 잃어버리지 않은 학생 먼저 추가
        HashSet<Integer> reserveSet = new HashSet<>();
        HashSet<Integer> lostSet = new HashSet<>();
        
        // reserve를 Set으로 변환
        for (int r : reserve) {
            reserveSet.add(r);
        }
        
        // 여벌이 있으면서 잃어버린 학생 체크 및 제거
        for (int l : lost) {
            if (reserveSet.contains(l)) {
                reserveSet.remove(l);
                answer++;
            } else { // 여벌 있고 잃어버린 게 아닐 경우에만 lostSet에 추가
                lostSet.add(l);
            }
        }
        
        // 남은 도난당한 학생들에게 체육복 빌려주기
        for (int l : lostSet) {
            if (reserveSet.contains(l - 1)) {
                reserveSet.remove(l - 1);
                answer++;
            } else if (reserveSet.contains(l + 1)) {
                reserveSet.remove(l + 1);
                answer++;
            }
        }
        
        return answer;
    }
}

실행 시간

테스트 1 〉	통과 (0.08ms, 74.1MB)
테스트 2 〉	통과 (0.08ms, 71.4MB)
테스트 3 〉	통과 (0.08ms, 76MB)
테스트 4 〉	통과 (0.09ms, 67.1MB)
테스트 5 〉	통과 (0.06ms, 75.4MB)
테스트 6 〉	통과 (0.08ms, 83.1MB)
테스트 7 〉	통과 (0.11ms, 77.1MB)
테스트 8 〉	통과 (0.08ms, 67.4MB)
테스트 9 〉	통과 (0.09ms, 81.5MB)
테스트 10 〉	통과 (0.11ms, 71.8MB)
테스트 11 〉	통과 (0.09ms, 76.8MB)
테스트 12 〉	통과 (0.07ms, 75.8MB)
테스트 13 〉	통과 (0.09ms, 72MB)
테스트 14 〉	통과 (0.08ms, 65.8MB)
테스트 15 〉	통과 (0.08ms, 76.8MB)
테스트 16 〉	통과 (0.11ms, 78MB)
테스트 17 〉	통과 (0.08ms, 69.8MB)
테스트 18 〉	통과 (0.07ms, 75.8MB)
테스트 19 〉	통과 (0.07ms, 74.4MB)
테스트 20 〉	통과 (0.06ms, 70.8MB)
테스트 21 〉	통과 (0.08ms, 67.9MB)
테스트 22 〉	통과 (0.05ms, 65.8MB)
테스트 23 〉	통과 (0.06ms, 76.6MB)
테스트 24 〉	통과 (0.05ms, 74.5MB)
테스트 25 〉	통과 (0.09ms, 72.9MB)
테스트 26 〉	통과 (0.07ms, 83.9MB)
테스트 27 〉	통과 (0.07ms, 72.1MB)
테스트 28 〉	통과 (0.08ms, 74.9MB)
테스트 29 〉	통과 (0.06ms, 74.7MB)
테스트 30 〉	통과 (0.07ms, 76.2MB)

풀이 중 실수한 부분

1) +와 -를 같이 체크

            if (reserveSet.contains(l - 1) || reserveSet.contains(l + 1)) {
                reserveSet.remove(r);
                answer++;
            }

2) 여벌이 있으면서 잃어버린 학생을 lost 배열에서 값 제거 안 함

      	// 여벌이 있으면서 잃어버린 학생 체크
        for(int l :lost){
            for (int r : reserve){
                if(l == r){
                    reserveSet.remove(r);
                }
            }
        }

체육복을 빌리지 않아도 되는데 빌리게 되는 경우 발생

다른 사람의 풀이

체육복 갯수 배열을 생성하여 풀이

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int[] people = new int[n];
        int answer = n;
        
    	// people 배열은 -1, 0, 1 중 하나로 체육복 갯수를 저장
        for (int l : lost) 
            people[l-1]--;
        for (int r : reserve) 
            people[r-1]++;

		// 
        for (int i = 0; i < people.length; i++) {
        	// 빌려야 하는 경우
            if(people[i] == -1) {
            	// 앞 사람이 체육복이 있을 때
                if(i-1>=0 && people[i-1] == 1) {
                    people[i]++; // 빌렸음
                    people[i-1]--; // 빌려준 사람 갯수 --
                 // 뒷 사람이 체육복이 있을 때
                }else if(i+1< people.length && people[i+1] == 1) {
                    people[i]++;
                    people[i+1]--;
                }else  // 못 빌렸을 때
                    answer--;
            }
        }
        return answer;
    }
}
profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글