알고리즘 공부/문제 풀이

[프로그래머스] 탐욕 알고리즘 - 체육복

valid_ming 2020. 8. 17. 11:59
static int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        
        int lost_index=0, reserve_index=0;
        int[] students=new int[n+2];	//1~n번까지, 앞뒤로 하나씩 추가하여 따로 예외처리하지 않음
        
        // 순차적으로 들어오지 않을 수 있기 때문에 
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        // students 배열 만들기
        for(int i=1;i<=n;i++) {
        	students[i]=1;
        	if(lost_index<lost.length && i==lost[lost_index]) {
        		students[i]--;
        		lost_index++;
        	}
        	if(reserve_index<reserve.length && i==reserve[reserve_index]) {
        		students[i]++;
        		reserve_index++;
        	}
        }
        
        // 앞번호 먼저 살피어보고 뒷 번호 살피기
        for(int i=1;i<=n;i++) {
        	if(students[i]==0) {
        		if(students[i-1]>1) {
        			students[i-1]--;
        			students[i]++;
        		}
        		else if(students[i+1]>1) {
        			students[i+1]--;
        			students[i]++;
        		}
        	}
        }
        
        // 체육복 있는사람 세기
        for(int i=1;i<=n;i++) {
        	if(students[i]>=1) answer++;
        }
        
        
        return answer;
    }

포인트

- 인덱스가 배열을 넘어가는 예외를 처리하지 않고 배열을 크게 선언하였다.

- 배열이 순차적으로 들어오지 않는 경우를 대비해 sort를 해 주었다.

- 여벌이 있으면 ++, lost 이면 -- 하여 students 배열을 채워준다.

- 앞 번호 먼저 살피고 뒷 번호를 살피어 체육복을 빌려준다.

- students배열의 값이 1인 수를 세어 정답으로 출력한다.

 

 

lost와 reserve를 이용하여 students배열을 초기화하는 과정에서 

lost와 reserve의 인덱스를 가리키는 두 개의 변수를 사용하였는데, 아래와 같이 작성하면 더 간단하다는 것을 알았다.

       for (int l : lost) 
            people[l-1]--;
        for (int r : reserve) 
            people[r-1]++;