[BOJ] 17224 - APC는 왜 서브태스크 대회가 되었을까?
사용 언어: Python3
문제
코드
내 풀이
# 문제의 개수 N
# 현정이의 역량 L (난이도)
# 현정이가 대회중에 풀 수 있는 문제의 최대 개수 K
N, L, K = map(int, input().split())
question_dic = {} # 각 문제 번호당 sub1, sub2
for i in range(N):
sub1, sub2 = map(int, input().split())
question_dic[i+1] = (sub1, sub2)
# 쉬운 버전의 난이도(sub1) 순으로 정렬
sorted_dic = dict(sorted(question_dic.items(), key=lambda x: x[1][0])) # 오름차순 정렬
# sorted_dic = dict(sorted(question_dic.items(), key=lambda x: x[1][0], reverse=True)) # 내림차순 정렬
score, cnt = 0, 0
for sub1, sub2 in sorted_dic.values():
if cnt == K:
break
if L >= sub2:
score += 140
cnt += 1
elif L >= sub1:
score += 100
cnt += 1
print(score)
- 부분점수만 받았다..ㅜ
dictionary 정렬
sorted()
메소드의 key 매개변수에 익명함수인 lambda 함수를 사용하면 value 값을 기준으로 데이터를 정렬할 수 있다.
dic.items()
의 경우(key, value)
튜플 형태의 원소를 제공하기에
lambda에서x[1]
와 같은 방식으로 value 값을 지정할 수 있는 것이다.
하지만 여기서는 value가(sub1, sub2)
과 같은 튜플 타입이기 때문에,
sub1을 기준으로 정렬할 때x[1][0]
으로 지정할 수 있다.
내 풀이 - 3/30 추가
# N: 문제 개수
# L: 현정이가 풀 수 있는 레벨
# K: 현정이가 풀 수 있는 문제 개수
N, L, K = map(int, input().split())
score = 0
sub1_L, sub2_L = 0, 0 # L만 고려하여 풀 수 있는 sub1, sub2 문제수
for _ in range(N):
sub1, sub2 = map(int, input().split())
if L >= sub2:
sub2_L += 1
elif L >= sub1:
sub1_L += 1
# L과 K를 고려하여 풀 수 있는 sub1, sub2 문제수
sub2_LK = min(K, sub2_L)
sub1_LK = min(K-sub2_LK, sub1_L)
# output
print(sub1_LK * 100 + sub2_LK * 140)
sub2_LK
를sub1_LK
보다 먼저 계산해야한다.sub1_LK = min(K, sub1_L) sub2_LK = min(K-sub1_LK, sub2_L)
이런식으로 순서를 바꾸면 부분점수만 받는다..!
다른 풀이
# 문제의 개수 N
# 현정이의 역량 L (난이도)
# 현정이가 대회중에 풀 수 있는 문제의 최대 개수 K
N, L, K = map(int, input().split())
sub1Cnt, sub2Cnt = 0, 0 # 난이도만 고려했을 때 풀 수 있는 sub1, sub2 문제수
for i in range(N):
sub1, sub2 = map(int, input().split())
if L >= sub2:
sub2Cnt += 1
elif L >= sub1:
sub1Cnt += 1
# 문제는 최대 K개 까지만 풀 수 있다
sub2Tot = min(sub2Cnt, K) # ✅ K까지 고려했을 때 풀 수 있는 sub2 문제수
sub1Tot = min(sub1Cnt, K-sub2Tot) # ✅ K까지 고려했을 때 풀 수 있는 sub1 문제수
print(sub2Tot * 140 + sub1Tot * 100)
- 이런 식으로 풀 수 있는 sub1, sub2 문제수를 각각 구하여 계산하면 더 쉽게 풀 수 있다.
💛 개인 공부 기록용 블로그입니다. 👻