본문 바로가기

알고리즘(Algorithm)

[C++] Yonsei TOTO (12018번)

https://www.acmicpc.net/problem/12018

 

12018번: Yonsei TOTO

연세대학교 수강신청이 얼마 전부터 바뀌어, 마일리지 제도로 바뀌었다. 이 제도는 각각의 학생들에게 마일리지를 주어 듣고 싶은 과목에 마일리지를 과목당 1~36을 분배한다. 그리고 모두 분배

www.acmicpc.net


문제풀이

각 과목에 최소한의 마일리지를 이용해서 최대한의 과목을 수강하는 것이 목적이다.

주의할 조건 몇가지를 알아보자, 마일리지는 한 과목에 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