본문 바로가기

백준 write-up/정렬 & 그리디

[백준] APC는 왜 서브태스크 대회가 되었을까? : 17224번 - Python

728x90
반응형

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

 

17224번: APC는 왜 서브태스크 대회가 되었을까?

2019년 올해도 어김없이 아주대학교 프로그래밍 경시대회(Ajou Programming Contest, APC)가 열렸다! 올해 새롭게 APC의 총감독을 맡게 된 준표는 대회 출제 과정 중 큰 고민에 빠졌다. APC에 참가하는 참가

www.acmicpc.net

 

 

 

문제의 접근 방법

 

- 현정이의 역량 L을 기준으로 문제의 난이도를 판단해주기

- 현정이가 풀 수 있는 수준에서 높은 점수를 얻을 수 있는 문제를 먼저 풀어야 함

- 쉬운 문제는 100점, 어려운 문제는 140점을 얻는다고 생각하기

 

 

 

내가 막혔던 부분

 

- 최대 점수를 얻기 위해서 여려운 버전의 난이도 순으로 오름차순 정렬해야 하는 부분을 놓침.

- 최대로 풀 수 있는 문제의 개수가 정해져 있기 때문에 모든 문제 케이스를 다 보지 않고도 반복문을 탈출해야할 수도 있고, 다 보고도 풀 수 있는 문제가 없어서 탈출해야 할 수 있다. 이 부분에서 어떤 방식으로 break문을 걸어주어야 할지 헤맸다.

* if, elif 문으로 연결하면 이 조건이거나 저 조건이거나의 케이스로 나누어서 생각하게 되지만 범위를 설정해서 break문을 걸 때는 둘다 if문으로 하면 두 조건문을 분리해서 사용할 수 있음!!!

 

 

 

문제 풀이 방법

 

(1) 문제의 개수 N, 현정이의 역량 L, 풀 수 있는 문제의 최대 개수 K 입력받기

 

(2) 쉬운 문제 sub1, 어려운 문제 sub2를 N개만큼 입력받아 빈 리스트 arr에 추가하기

 

(3) 어려운 버전의 문제부터 풀어야 최대 점수를 얻을 수 있으므로 sub2를 기준으로 오름차순 정렬하기

 

(4) arr안에 있는 요소를 가지고 두 번째 값(sub2)보다 현정이의 레벨(L)이 더 높거나 같으면 어려운 문제를 풀 수 있다는 것이므로 score변수에 140을 누적해서 더하기

최대로 풀 수 있는 문제의 개수를 맞추기 위해 한 문제 풀 때마다 변수 k에 누적해서 1을 더해주기

 

(5) 첫 번째 값(sub1) 보다 현정이의 레벨(L)이 더 높거나 같고 두 번째 값(sub2)보다 작다는 것은 쉬운 레벨의 문제를 풀 수 있다는 것이므로 score 변수에 100을 누적해서 더하기

이 역시 문제 하나를 푼 것이므로 변수 k에 누적해서 1을 더해주기

 

(6) (4),(5) 둘 중 어느 것에도 해당하지 않는 다는 것은 모든 문제의 레벨이 현정이 수준보다 높아서 풀 수 없다는 뜻이므로 pass! 

그리고 현정이가 푼 문제의 수 k가 기존에 입력 받았던 K값(현정이가 풀 수 있는 문제의 최대 개수)와 같아지면 더 이상 풀 수 있는 문제가 없다는 뜻이므로 반복문 탈출!!!

 

(7) 누적 합계인 점수 score을 출력해주기

 

 

 

소스코드

N,L,K = map(int, input().split())

arr = []
for _ in range(N):
    sub1, sub2 = map(int, input().split())
    arr.append([sub1,sub2])
    arr.sort(key=lambda x:x[1])

score = 0
k = 0
for i in arr:
    if k == K:
        break
        
    if i[1] <= L:
        score += 140
        k += 1
    elif i[0] <= L:
        score += 100
        k += 1

print(score)
728x90
반응형