본문 바로가기

PROGRAMMING/ALGORITHM

[프로그래머스] 체육복 JAVA

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

 

코딩테스트 연습 - 체육복

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

programmers.co.kr

 

체육복 빌리기

문제 포인트

1. 학생마다 번호가 있고 앞뒤 번호 학생에게만 빌릴 수 있다.

2. LOST와 RESERVE 명단에 둘 다 포함된 학생은 체육복을 빌려줄 수 없다.

 

해결 포인트

1. 학생이 가지고 있는 체육복의 갯수를 값으로 갖는 배열을 하나 만든다.

2. LOST RESERVE 배열 값에 따라 +-를 해준다.

3. 앞뒤 학생의 체육복 갯수가 2개 이상일 경우 차감하고 0개인 학생에게 더해준다.

   이 때 1번 학생은 앞, N번 학생은 뒤에 비교할 학생이 없음으로 제외

4. 체육복 배열을 FOR루프로 돌며 1개 이상인 학생 수를 SUM

 

public class Solution {
	public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        int[] student = new int[n+1];
        
        for(int i=0; i < n; i++) {
        	student[i]++;
        	if(i<lost.length)	student[lost[i]-1]--;
        	if(i<reserve.length)	student[reserve[i]-1]++;
        }
        
        for(int i=0; i < n; i++) {
        	if(student[i] == 0) {
        		if(i != 0 && student[i-1] > 1) {
        			student[i]++;
        			student[i-1]--;
        		}else if(i != n-1 && student[i+1] > 1) {
        			student[i]++;
        			student[i+1]--;
        		}
        	}
        }
        
        for(int i=0; i < n; i++) {
        	if(student[i] > 0) {
        		answer++;
        	}
        }
        return answer;
    }
}

 

문제 주제는 탐욕법인데.. 일단 풀고 싶은 대로 풀었다.

1단계 문제답게 재미있게 풀며 해결완료.