알고리즘 공부/문제 풀이
[프로그래머스] 탐욕 알고리즘 - 체육복
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]++;