포도가게의 개발일지

python 백준 5557 1학년(dp) 본문

백준

python 백준 5557 1학년(dp)

grape.store 2021. 9. 1. 13:45
반응형

백준 5557 1학년

https://www.acmicpc.net/problem/5557

 

5557번: 1학년

상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀

www.acmicpc.net

 

문제 : 주어진 수의 리스트중 + - 연산자를 활용하여 결과값이 나올 수 있는 경우의 수를 찾으시오

접근법 

 - 처음에는 두가지 경로로 나뉘는 경우의수여서 bfs로 접근할려 했지만 메모리 제한이 128mb라 dp로 접근하게 되었다.

 - dp 매트릭스는 가로축은 점수 세로축은 몇번째 값을 더하는지를 의미 한다.

 - dp[i][j+arr[i]] += dp[i-1][j]의 의미는 전 연산의 경우의 수(경로)가 있으면 그 score에 이번에 연산해야 할 점수를 + - 해주어

 경로를 2가지로 새롭게 만들어 준다. 다만 중간에 나오는 수가 0~20사이므로 넘어가게 되면 제외 해준다.

 - 또한, 전 경로에 현재 + - 해주어야 되는 값이어서 여러 경로로 왔을때 같은 score가 나올 수 있어 누적하게 해준다.

 

import sys
from collections import deque
sys.stdin = open('inputs.text')

n = int(sys.stdin.readline())
arr = deque(map(int,sys.stdin.readline().split()))

dp = [[0] * 21 for _ in range(n)]

dp[0][arr[0]] += 1
for i in range(1,n-1):
    for j in range(21):
        if dp[i-1][j]:
            if j + arr[i] <= 20: dp[i][j+arr[i]] += dp[i-1][j]
            if j - arr[i] >= 0: dp[i][j-arr[i]] += dp[i-1][j]

print(dp)

'백준' 카테고리의 다른 글

python 백준 13305 주유소  (0) 2021.09.14
python 15903 카드 합체 놀이  (0) 2021.09.13
python 백준 1946 신입사원  (0) 2021.08.30
python 백준 1931 회의실 배정  (0) 2021.08.30
python 백준 1904 01타일  (0) 2021.08.26
Comments