두 스택
면접 대비시간 제한1초메모리 제한1024 MB
두 가방의 맨 위 물건을 합쳐 최대 K개까지 뺄 때, 남은 두 가방 중 무거운 쪽의 무게를 가장 작게 만드는 값을 구합니다.
문제
승형이와 원빈이는 배낭여행을 가기 위해 배낭을 하나씩 준비했다. 두 배낭에는 각각 개의 물건이 들어 있다.
- 첫 번째 배낭에는 무게가 인 물건이 아래에서 위로 쌓여 있다. 이 맨 위 물건의 무게이다.
- 두 번째 배낭에는 무게가 인 물건이 아래에서 위로 쌓여 있다. 이 맨 위 물건의 무게이다.
배낭의 무게는 배낭 안에 남은 물건 무게의 합이다. 원빈이는 두 배낭 중 하나를 골라 맨 위 물건을 없앨 수 있으며, 이 작업은 최대 번까지 할 수 있다. 물건을 없애면 고른 배낭의 무게가 그 물건의 무게만큼 줄어든다. 고른 배낭에 물건이 하나도 없으면 아무 일도 일어나지 않는다.
원빈이의 작업이 모두 끝나면 승형이가 멜 배낭을 정한다. 승형이는 약삭빠르기 때문에 항상 두 배낭 중 더 가벼운 쪽을 멘다. 두 배낭의 무게가 같으면 둘 중 아무거나 멘다. 원빈이는 승형이가 메지 않은 배낭을 들어야 한다.
원빈이가 들어야 하는 배낭 무게의 최솟값을 구하라.
입력
첫 줄에 정수 과 가 주어진다.
둘째 줄에 첫 번째 배낭 물건들의 무게 이 주어진다.
셋째 줄에 두 번째 배낭 물건들의 무게 이 주어진다.
출력
원빈이가 들어야 하는 배낭 무게의 최솟값을 출력한다.
힌트
이 문제는 입력 데이터의 용량이 커서, 시간 초과를 받지 않으려면 빠른 입출력 방법을 써야 할 수도 있다.
-
C++에서
cin과cout을 쓰려면:main함수 맨 위에cin.tie(nullptr)와ios::sync_with_stdio(false)를 적는다.endl대신 개행 문자(\n)를 쓴다.- 이 방식을 쓰면
scanf,printf,puts,getchar,putchar같은 C의 입출력 함수를 쓰면 안 된다.
-
Java를 쓴다면:
Scanner와System.out.println대신BufferedReader와BufferedWriter를 쓴다.- 마지막에
BufferedWriter.flush를 한 번 호출한다.
-
Python을 쓴다면:
input대신sys.stdin.readline을 쓴다. 이 함수는 맨 끝의 개행 문자까지 함께 입력받는다.- 개행 문자를 뺀 문자열을 저장하고 싶다면
.rstrip()을 붙이는 것이 좋다.