개발하지연
[백준 5557번] 1학년 (python) 본문
문제
상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀고 있다. 예를 들어, "8 3 2 4 8 7 2 4 0 8 8"에서 등식 "8+3-2-4+8-7-2-4-0+8=8"을 만들 수 있다.
상근이는 올바른 등식을 만들려고 한다. 상근이는 아직 학교에서 음수를 배우지 않았고, 20을 넘는 수는 모른다. 따라서, 왼쪽부터 계산할 때, 중간에 나오는 수가 모두 0 이상 20 이하이어야 한다. 예를 들어, "8+3+2-4-8-7+2+4+0+8=8"은 올바른 등식이지만, 8+3+2-4-8-7이 음수이기 때문에, 상근이가 만들 수 없는 등식이다.
숫자가 주어졌을 때, 상근이가 만들 수 있는 올바른 등식의 수를 구하는 프로그램을 작성하시오.
기록
(dp 11일차) 테이블을 어떻게 구성하냐가 너무 어려운 것 같다. 그래도 이것저것 적어보면서 하니까 조금씩 알 것 같다.
ex) 6 / 6 4 2 3 2 4 일 때,
가로를 0~20까지의 숫자로 설정하고, 세로를 수식의 숫자 순서로 설정한다.
각 줄마다 각 숫자의 +n, -n한 숫자의 경우의 수를 다음 줄에 저장해나간다. 따라서 각 줄에 저장된 숫자의 의미는 i번째 숫자까지 계산하여 j를 만들 수 있는 경우의 수 이다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | ... | 20 | |
6 | 1 | ||||||||
4 | 1 | ||||||||
2 | 1 | 1 | |||||||
3 | 1 | 1 | 1 | ||||||
2 | 1 | 1 | 2 | 1 |
마지막 수식까지 계산한 결과에서 계산결과인 4를 만들 수 있는 경우의 수를 찾는다.
코드
N = int(input())
nums = list(map(int, input().split()))
dp = [[0]*21 for i in range(N-1)]
dp[0][nums[0]] = 1
for i in range(1, N-1):
for j in range(21):
if j-nums[i]>=0: dp[i][j-nums[i]] += dp[i-1][j]
if j+nums[i]<=20: dp[i][j+nums[i]] += dp[i-1][j]
print(dp[-1][nums[-1]])
1. i번째까지 계산하여 j를 만들 수 있는 방법의 개수를 저장할 이차원 배열 dp를 생성한다.
2. 현재 숫자에 +n, -n을 하여 다음 줄에 방법의 개수를 더한다.
3. dp에서 끝까지 계산한 결과 중 계산결과인 마지막 수를 만들 수 있는 방법의 개수를 출력한다.
'알고리즘' 카테고리의 다른 글
[백준 2631번] 줄세우기 (python) (0) | 2021.08.02 |
---|---|
[백준 1915번] 가장 큰 정사각형 (python) (1) | 2021.08.02 |
[백준 9084번] 동전 (python) (0) | 2021.07.31 |
[백준 15724번] 주지수 (python) (0) | 2021.07.31 |
[백준 21317번] 징검다리 건너기 (python) (0) | 2021.07.31 |