-
[프로그래머스] 탐욕 알고리즘 - 체육복알고리즘 공부/문제 풀이 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]++;
'알고리즘 공부 > 문제 풀이' 카테고리의 다른 글
[프로그래머스] 탐욕 알고리즘 - 조이스틱 (1) 2020.08.18 [프로그래머스] 탐욕 알고리즘 - 큰 수 만들기 (2) 2020.08.17 [프로그래머스] 완전 탐색 - 소수 찾기 (1) 2020.08.16 [프로그래머스] 완전탐색 - 카펫 (1) 2020.08.16 [프로그래머스] 완전 탐색 - 모의고사 (1) 2020.08.14