Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발하지연

[백준 5557번] 1학년 (python) 본문

알고리즘

[백준 5557번] 1학년 (python)

JeongJiyeon 2021. 8. 2. 19:24

문제

상근이가 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에서 끝까지 계산한 결과 중 계산결과인 마지막 수를 만들 수 있는 방법의 개수를 출력한다.

Comments