https://www.acmicpc.net/problem/12018
문제풀이
각 과목에 최소한의 마일리지를 이용해서 최대한의 과목을 수강하는 것이 목적이다.
주의할 조건 몇가지를 알아보자, 마일리지는 한 과목에 1~36점을 넣을 수 있다. 0점 못넣는다.
점수가 같으면 성준이가 먼저 수강한다.
풀이 과정은 아래와 같다.
1. 과목별 수강신청을 위한 최소 마일리지를 저장할 배열을 만든다.
2. 각 과목별 최소 마일리지를 구하는데 만약 지원자보다 수강가능 인원이 많다면, 해당 과목은 필요 마일리지가 반드시 1이다.
3. 그렇지 않은경우 지원자들의 마일리지를 내림차순 정렬한 뒤, 수강가능인원-1 인덱스 값이 최소 필요 마일리지이므로 해당값을 저장한다.
4. 이렇게 각 과목별 최소 마일리지를 구했으면, 이 배열을 정렬한다. 그리고 내 마일리지에서 빼가며 수강 과목수를 증가시킨다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int arr[n] = {0, };
for(int i=0; i<n; i++) {
int a, b;
cin >> a >> b;
int points[a];
for(int j=0; j<a; j++) cin >> points[j];
// 지원자보다 자리가 더 많으면 패스
if(a<b) {
arr[i] = 1;
continue;
}
sort(points, points+a, greater<int>());
arr[i] = points[b-1];
}
sort(arr, arr+n);
int answer = 0;
for(int i=0; i<n; i++) {
m -= arr[i];
if(m < 0) break;
else answer++;
}
cout << answer;
return 0;
}
느낀점
요즘 문제 제출 원트에 맞는 경우가 없다. 너무 걱정이다. 왜 자꾸 하나씩 빼먹고 구현하고, 하나씩 놓치는 부분이 있는지 모르겠다. 더 화딱지 나는건, 테스트케이스에서 안걸린다. 그래서 질문게시판에서 반례를 찾아보는 경우가 많다.
코드를 다시 차근차근 읽고 어디에 문제가 있는지 생각하는 연습을 더 해야겠다. 질문게시판 들어가는 것을 의식적으로 하지 말아야겠다는 생각이 많이 든다.
'알고리즘(Algorithm)' 카테고리의 다른 글
[C++] 문자열 복사 (2195번) (0) | 2023.11.29 |
---|---|
[C++] 체인 (2785번) (0) | 2023.11.23 |
[JavaScript] 귤 고르기 (프로그래머스 LEVEL 2) (0) | 2023.11.17 |
[C++] 동전 (9084번) (1) | 2023.11.16 |
[C++] 네트워크 연결 (1922번) (1) | 2023.11.13 |