11062번: 카드 게임
근우와 명우는 재미있는 카드 게임을 하고 있다. N개의 카드가 일렬로 놓여 있다. 각 카드에는 점수가 적혀있다. 근우부터 시작하여 번갈아가면서 턴이 진행되는데 한 턴에는 가장 왼쪽에 있는
www.acmicpc.net
DP를 사용하는 문제이다. 시간초과가 나서 Pypy3으로 제출하였다.
최선을 다해 게임에 임한다는 것이 이해하기 너무 힘들었다.
dp[i][j]는 i번째 카드부터 j번째 카드로 게임을 할때 [1번째로 뽑는 사람 점수, 2번째로 뽑는 사람 점수]를 저장해준다.

카드게임을 할 때 왼쪽카드를 가져가거나 오른쪽 카드를 가져가는 방법이 있다.
1. 왼쪽 카드를 뽑을 때
처음 사람은 왼쪽 카드(1)와 나머지카드(2,5,2)에서 2번째로 뽑는 사람의 점수를 합한 것이다.
다음 사람은 나머지 카드(2,5,2)에서 1번째로 뽑는 사람의 점수이다.
2. 오른쪽 카드를 뽑을 때
처음 사람은 오른쪽 카드(2)와 나머지카드(1,2,5)에서 2번째로 뽑는 사람의 점수를 합한 것이다.
다음 사람은 나머지 카드(1,2,5)에서 1번째로 뽑는 사람의 점수이다.
- 카드의 정보를 cards 배열에 저장한다.
- pickCard는 cards에서 i번째부터 j번째 카드가 있을 때 카드를 선택하는 함수이다.
- 이미 정보가 있다면 리턴해준다.
- 카드가 한장이라면(i==j) 1번째 사람만 가져가므로 [카드 점수, 0] 를 리턴해준다.
- 위에서 설명했듯이 score를 계산해준 후, 1번째로 뽑은 사람과 2번째로 뽑은 사람의 점수를 dp에 저장해준다.
- 카드 0~N-1에서 1번째로 뽑는 사람의 점수 값을 출력해준다.
import sys input = sys.stdin.readline def pickCard(cards, i, j): if dp[i][j]: return dp[i][j] if i == j: dp[i][j] = [cards[i], 0] return dp[i][j] first1, second1 = pickCard(cards, i+1, j) score1 = second1 + cards[i] first2, second2 = pickCard(cards, i, j-1) score2 = second2 + cards[j] if score1 > score2: dp[i][j] = [score1, first1] else: dp[i][j] = [score2, first2] return dp[i][j] T = int(input()) for _ in range(T): N = int(input()) dp = [[None for _ in range(N+1)] for _ in range(N+1)] cards = list(map(int, input().split())) print(pickCard(cards, 0, N-1)[0])
'개발 > 알고리즘' 카테고리의 다른 글
[백준 16174] 점프왕 쩰리 (Large) (python) (0) | 2021.05.25 |
---|---|
[백준 4256] 트리 (python) (0) | 2021.05.13 |
[백준 7579] 앱 (python) (0) | 2021.05.10 |
[백준 2156] 포도주 시식 (python) (0) | 2021.05.10 |
[백준 5582] 공통 부분 문자열 (python) (0) | 2021.05.09 |
최근댓글