https://www.acmicpc.net/problem/17224
문제의 접근 방법
- 현정이의 역량 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)
'백준 write-up > 정렬 & 그리디' 카테고리의 다른 글
[백준] 삼각형 만들기 : 1448번 - Python (0) | 2021.08.18 |
---|---|
[백준] 카드 문자열 : 13417번 - Python (0) | 2021.08.18 |
[백준] 오셀로 재배치 : 13413번 - Python (0) | 2021.08.16 |
[백준] 햄버거 분배 : 19941번 - Python (0) | 2021.08.15 |
[백준] 피보나치 : 9009번 - Python (0) | 2021.08.11 |