1 minute read

코딩테스트 연습

1.

  • 제주대 학생회관 식당에는 두 개의 메뉴가 있다. 코너 A로 가면 5,000원짜리 메뉴를 먹을 수 있고, 코너 B로 가면 1,000원짜리 메뉴를 먹을 수 있다.

  • 준원이는 대면 수업이 시작되는 바람에 이제 남은 학기의 $N$일동안 매일 학식의 두 메뉴 중 정확히 하나를 골라서 먹어야 한다.
  • $N$일간의 두 메뉴는 이미 공지되어 있고, 준원이는 이미 모든 날의 각 메뉴가 얼마나 맛있을지 수치를 매겨 두었다.

  • 준원이는 $N$일간 학식에 총 $X$원 이하를 써야 한다.

  • 여러분이 $N$일간 준원이의 메뉴를 잘 골라서, 고른 메뉴의 맛의 합을 최대화 해주자!

입력

  • 첫째 줄에는 두 정수 $N$, $X$가 주어진다.

  • 둘째 줄부터 $N$개의 줄에, 각 날에 먹을 수 있는 5,000원짜리 메뉴의 맛 $A$와 1,000원짜리 메뉴의 맛 $B$가 공백을 사이에 두고 주어진다.

출력

  • 준원이가 고른 메뉴들의 맛의 합을 최대화했을 때의 값을 출력하라.

풀이

# your code goes here
 
import sys
 
# 첫째 줄에는 두 정수 N, X가 주어진다.
# 둘째 줄부터 N개의 줄에,
# 각 날에 먹을 수 있는 5,000원짜리 메뉴의 맛 A와 1,000원짜리 메뉴의 맛 B가 공백을 사이에 두고 주어진다.
 
N, X = list(map(int,sys.stdin.readline().split()))
 
A = []
B = []
 
val_diff = []
val_idx = []
 
 
for i in range(0,N):
	 a, b = list(map(int,sys.stdin.readline().split()))
 
	 A.append(a)
	 B.append(b)
 
	 val_diff.append(a-b)
	 val_idx.append(i)
	 
for j in range(0,len(val_diff)-1):
	if val_diff[i] > val_diff[j]:
	 	tmp = val_diff[i]
	 	tmp2 = val_idx[i]
	 	val_diff[i] = val_diff[j]
	 	val_idx[i] = val_idx[j]
	 	val_diff[j] = tmp
	 	val_idx[j] = tmp2
 

 
# 매일 밥을 먹긴 해야하므로, 가치가 큰쪽을 무조건 선택.
# 단, 예산이 오버되었을 경우에 한해 5000원짜리 선택들중 가치가 가장 낮은쪽을 1000원짜리 메뉴로 변경.

max = []
 
for i in range(0,N):
	if val_diff[i] > 0 and X > 5000:
		X -= 5000
		max.append(A[val_idx[i]])
	elif val_diff[i] > 0 and X < 5000:
		X -= 1000
		max.append(B[val_idx[i]])
	elif val_diff[i] < 0:
		X -= 1000
		max.append(B[val_idx[i]])
 
print(sum(max))

채점 결과

  • 오답(시간 초과)