[BOJ] 17224 APC는 왜 서브태스크 대회가 되었을까? (Python3)
문제
현정이는 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
댓글남기기