알고리즘 문제 풀이

[프로그래머스]체육복

v 2021. 3. 5. 16:00

programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

1. boolean array 2개를 만들어서 하나는 유니폼이 있는 학생, 하나는 여유분이 있는 학생으로 나눴다.

2. 먼저 여유분이 있지만 도난당한 학생을 먼저 처리해주고,  이후엔 앞의 번호의 학생에게 우선 빌려주는 방식으로 처리하였다.

풀이 과정에서 11번이 안 되었는데 배열을 쓰는 과정에서 제일 끝 값에 대한 처리가 미흡했던 것으로 추측 된다.

예시의 테스트케이스를 이용하여 해결하였다.

11번이 되고나니 12번이 안 되었다. 12번은 여유분이 있지만 도난 당한 경우여서 그에 대한 거를 먼저 처리해 주니 잘 처리 되었다.

 

굳이 배열을 따로 만들지 않고 한번에도 처리 가능한듯 싶다.

 

set으로도 된다고도 한다.-> 나중에 도전!

 

import java.util.*;
class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;

        answer = n-lost.length;
        boolean []hasUniform = new boolean[n+1];
        boolean []reserveCheckAll= new boolean[n+1];
        Arrays.fill(hasUniform, true);
        
        for (int i = 0; i < lost.length; i++) {
			hasUniform[lost[i]] = false;
		}
        
        for (int i = 0; i < reserve.length; i++) {
			reserveCheckAll[reserve[i]] = true;
			if(!hasUniform[reserve[i]]&& reserveCheckAll[reserve[i]]) {
				reserveCheckAll[reserve[i]]= false;
				hasUniform[reserve[i]] = true;
				answer++;
				continue;
			}
		}
        int cnt = 0;
        for (int i = 0; i < lost.length; i++) {
        	int student = lost[i];
        	if(hasUniform[student]) continue;
    		int prevStudent = student-1;
    		int nextStudent = student+1;
    		
    		if(nextStudent> 1 && reserveCheckAll[prevStudent]) {
    			reserveCheckAll[prevStudent]= false;
    			hasUniform[student] = true;
    			cnt++;
    			continue;
    		}
    		if(nextStudent<= n && reserveCheckAll[nextStudent]) {
    			reserveCheckAll[nextStudent]= false;
    			hasUniform[student] = true;
    			cnt++;
    			continue;
    		}
        }
        System.out.println(answer+cnt);
        return answer+cnt;
    }
    public static void main(String[] args) {
		Solution s = new Solution();
        //11번 테스트케이스
		int n = 9;
		int[] lost = {2,4,7,8};
		int[] reserve = {3,6,9};
		//s.solution(n, lost, reserve);
        //12번 테스트케이스
		n = 5;
		lost = new int[] {1,2,3};
		reserve = new int []{2,3,4};
		s.solution(n, lost, reserve);
	}
}
반응형