728x90
반응형
https://www.acmicpc.net/problem/2923
2923번: 숫자 게임
창영이와 현우는 새로운 게임을 하고 있다. 이 게임은 여러 라운드로 이루어져 있다. 매 라운드가 시작할 때, 현우는 창영이에게 100보다 작은 두 숫자 A와 B를 말해준다. 그러고 난 뒤, 창영이는
www.acmicpc.net
문제 해결
- n번 숫자 쌍이 추가 될 때마다 A와 B의 원소를 쌍을 맞춰 각 쌍의 최댓값의 최솟값을 구하는 문제
- 쉽게 직관적으로 A의 오름차순 수열 $a_{1}$, $a_{2}$ , ... 라 하고 B의 내림 차순 수열 $b_{1}$, $b_{2}$, ..라 할 때 answer = min($a_{i}+b_{i}$) 가 될 것이다.
- 그러므로 각 숫자의 개수를 인지한 다음 하나씩 짝을 맞추었을 때 합의 최댓값을 구하면 된다.
- 그리고 숫자가 추가되기전 원래대로 수열을 리셋시키고 추가로 숫자를 받아야한다.(사실 중간에 삽입해도 되기는 한데... 복잡도가 오히려 커질수 있다...)
CODE
# 2923
import sys
input = sys.stdin.readline
import copy
def minmaxsum():
originalA = copy.deepcopy(A)
originalB = copy.deepcopy(B)
a, b = findindex(A, 1, False), findindex(B, 100, True) # 존재하는 숫자 찾기
minVar = min(A[a], B[b])
A[a] -= minVar
B[b] -= minVar
result = 0
while a != -1 and b != -1:
result = max(result, a + b)
a, b = findindex(A, a, False), findindex(B, b, True)
minVar = min(A[a], B[b])
A[a] -= minVar
B[b] -= minVar
for i in range(1, 101): # 다시 리셋
A[i] = originalA[i]
B[i] = originalB[i]
return result
def findindex(nums, startindex, isreversed):
if isreversed == False:
for i in range(startindex, 101):
if nums[i] >= 1:
return i
else:
for i in range(startindex, 0, -1):
if nums[i] >= 1:
return i
return -1
if __name__ == "__main__":
n = int(input())
A = [0] * 101
B = [0] * 101
for _ in range(n):
a, b = map(int, input().split())
A[a] += 1
B[b] += 1
answer = minmaxsum()
print(answer)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 14891 톱니바퀴 (0) | 2023.05.22 |
---|---|
[python] 백준 14499 주사위 굴리기 (0) | 2023.05.18 |
[python] 백준 1736 쓰레기 치우기 (0) | 2023.05.13 |
[python] 백준 19644 좀비 떼가 기관총 진지에도 오다니 (0) | 2023.05.12 |
[python] 백준 1464 뒤집기 3 (0) | 2023.05.11 |
댓글