수열 걷기
티어 : Silver 1
시간 제한 : 1 초
메모리 제한 : 128 MB
알고리즘 분류 : 구현, 두 포인터
문제
길이가 유한하고, 오름차순 순서로 되어있는 두 수열이 주어진다. 두 수열에 공통으로 들어있는 원소는 교차점으로 생각할 수 있다.

아래는 두 수열과 교차점은 굵게 나타낸 것이다.
수열 1 = 3 5 7 9 20 25 30 40 55 56 57 60 62
수열 2 = 1 4 7 11 14 25 44 47 55 57 100
이 두 수열은 다음과 같이 걸을 수 있다.
- 두 수열중 하나의 첫 번째 원소에서 걷기를 시작한다. 걷는 것은 앞으로만 걸을 수 있다.
- 교차점에 도착했을 때는, 현재 수열에서 계속 걸을지, 다른 수열로 갈아탈지 결정할 수 있다.
방문한 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하시오. 위의 예에서 3, 5, 7, 9, 20, 25, 44, 47, 55, 56, 57, 60, 62와 같이 걷는다면 합이 450으로 최대가 된다.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 두 줄로 이루어져 있다.
각 줄의 첫 번째 수는 수열의 길이이다. 그 다음에는 수열의 원소가 순서대로 주어진다. 수열의 길이는 1이상이고, 10,000을 넘지 않는다. 수열에 들어있는 모든 수는 -10,000보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
입력의 마지막 줄에는 0이 하나 주어진다.
출력
각 테스트 케이스에 대해서, 얻을 수 있는 최대 합을 출력한다.
예제 입출력
Algorithm
이진 탐색 - bisect
1. bisect를 이용해 수열1과 수열2의 같은 값 찾기
2. 같은 수를 찾으면 각 수열에서 해당 숫자 이전까지의 합 구하기
3. answer에 각 수열의 합 중 최댓값 저장
Code
import sys
from bisect import bisect_left, bisect_right
input = sys.stdin.readline
while True:
# 입력
sequence1 = list(map(int, input().split()))
# 0이 하나 주어지면 break
if sum(sequence1) == 0:
break
seq1_len = sequence1[0]
sequence1 = sequence1[1:]
sequence2 = list(map(int, input().split()))
seq2_len = sequence2[0]
sequence2 = sequence2[1:]
answer = 0
index1 = 0 # 수열 1의 동일한 숫자의 index
index2 = 0 # 수열 2의 동일한 숫자의 index
for num in sequence1:
# 동일한 숫자가 있으면
if bisect_right(sequence2, num) - bisect_left(sequence2, num) > 0:
# 첫 번째 수열의 해당 숫자까지의 합
sum_seq1 = sum(sequence1[index1:bisect_right(sequence1, num)])
# 두 번째 수열의 해당 숫자까지의 합
sum_seq2 = sum(sequence2[index2:bisect_right(sequence2, num)])
# 각 수열의 누적합 중 큰 값을 answer에 누적합
answer += max(sum_seq1, sum_seq2)
# 각 수열의 inex 갱신
index1 = bisect_right(sequence1, num)
index2 = bisect_right(sequence2, num)
# 마지막 길의 최댓값 구해 answer에 추가
answer += max(sum(sequence1[index1:]), sum(sequence2[index2:]))
print(answer)
메모리: 33948 KB
시간: 100 ms
'백준' 카테고리의 다른 글
[백준 11053] 가장 긴 증가하는 부분 수열 Python (0) | 2022.03.19 |
---|---|
[백준 9095] 1, 2, 3 더하기 Python (0) | 2022.03.19 |
[백준 9012] 괄호 Python (0) | 2022.03.19 |
[백준 10773] 제로 Python (0) | 2022.03.19 |
[백준 2792] 보석 상자 Python (0) | 2022.03.09 |