[BOJ] 17224 APC는 왜 서브태스크 대회가 되었을까? (Python3)

2 분 소요

문제

현정이는 APC에 한 번이라도 나가보고 싶다는 소망이 있다. 하지만 이 소망은 여태까지 단 한 번도, 그리고 앞으로도 이루어질 리 없기 때문에 현정이가 입버릇처럼 하게 된 말이 있는데…

현정 : 아~~ 나도 APC 참가만 했으면 상금 받는 건데~~~~~
준표 : … 그건 아닌 것 같은데?
현정이의 근거 없는 자신감이 눈꼴신 준표는 출제 중에 평가한 문제 난이도를 통해 현정이의 예상 점수를 알려주고 현정이가 현실을 받아들일 수 있도록 도와주고자 한다.

현정이는 L 만큼의 역량을 가지고 있어 L보다 작거나 같은 난이도의 문제를 풀 수 있다. 또한 현정이는 코딩이 느리기 때문에 대회 시간이 부족해 K개보다 많은 문제는 해결할 수 없다. 어떤 문제에 대해 쉬운 버전을 해결한다면 100점을 얻고, 어려운 버전을 해결한다면 여기에 40점을 더 받아 140점을 얻게 된다. 어려운 버전을 해결하면 쉬운 버전도 같이 풀리게 되므로, 한 문제를 해결한 것으로 계산한다.

현정이가 APC에 참가했다면 최대 몇점을 얻을 수 있었을지 알려주자.

입력

첫 줄에 문제의 개수 N, 현정이의 역량 L, 현정이가 대회중에 풀 수 있는 문제의 최대 개수 K가 주어진다.

둘째 줄부터 N개의 줄에 걸쳐 1 ~ N번째 문제의 쉬운 버전의 난이도 sub1, 어려운 버전의 난이도 sub2 가 순서대로 주어진다.

출력

현정이가 APC에 참가했다면 얻었을 점수의 최대값을 출력한다.

제한

1
2
3
4
5
6
7
1 ≤ N ≤ 100
1 ≤ L ≤ 50
1 ≤ sub1 ≤ sub2 ≤ 50
서브태스크 1 (100점)
K = N
서브태스크 2 (40점)
0 ≤ K ≤ N
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
예제 입력 1  복사
4 8 4
1 8
4 5
6 20
9 12
예제 출력 1  복사
380
1번, 2번 문제의 어려운 버전을 해결해 2×140 = 280점을, 3번 문제의 쉬운 버전을 해결해 100점을 얻어 총 380점을 얻는다.

현정이가 4문제를 풀 수 있을 정도로 대회 시간은 충분하지만, 4번 문제는 현정이에겐 너무 어려워서 풀 수 없다.

예제 입력 2  복사
8 7 5
1 3
2 5
3 5
4 8
5 8
6 9
6 7
7 10
예제 출력 2  복사
660
예제 입력 3  복사
8 9 5
1 8
3 10
4 5
5 20
7 12
8 15
9 50
14 14
예제 출력 3  복사
580
힌트
예제2, 3은 서브태스크1에서는 나오지 않는다.

전통적으로 APC는 쉬운 버전의 문제를 먼저 푸는 것이 정신건강과 안정적인 득점을 위해 좋다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
N,L,K = map(int, input().split()) ##문제의 개수 N, 현정이의 역량 L, 현정이의 최대 풀이 문제 개수 K

difficult = []
for i in range(N):
    difficult.append(list(map(int, input().split())))
#difficult 리스트에 서브태스크1,2를 리스트로 묶어서 넣는다.
difficult. sort()
#서브태스크 1의 난이도를 기준으로 정렬
score_list = []


for problem in difficult:
    if L >= problem[1]:#역량보다 sub2 문제의 난이도가 적거나 같다면 스코어 +100
        score_list.append(140)
    else: #sub 2문제를 못풀경우
        if L >= problem[0]: #역량보다 sub1 문제의 난이도가 적거나 같다면 스코어 +100
            score_list.append(100)
        else:
            pass
score = 0
for i in range(K): 
    if len(score_list) == 0: #리스트가 비었으면 for문 종료
        break
    score += max(score_list) #max값을 score에 더해주고
    score_list.remove(max(score_list)) #더한 max값은 리스트에서 제거
    
    
print(score)
    
    

    
1
2
3
4
5
6
4 8 4
1 8
4 5
6 20
9 12
380

댓글남기기