출처 : 백준 #5557
시간 제한 | 메모리 제한 |
---|---|
1초 | 128MB |
상근이가 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이 음수이기 때문에, 상근이가 만들 수 없는 등식이다.
숫자가 주어졌을 때, 상근이가 만들 수 있는 올바른 등식의 수를 구하는 프로그램을 작성하시오.
첫째 줄에 숫자의 개수 N이 주어진다. (3 ≤ N ≤ 100) 둘째 줄에는 0 이상 9 이하의 정수 N개가 공백으로 구분해 주어진다.
첫째 줄에 상근이가 만들 수 있는 올바른 등식의 개수를 출력한다. 이 값은 263-1 이하이다.
11
8 3 2 4 8 7 2 4 0 8 8
10
40
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1
7069052760
예제 1의 경우 다음과 같이 10가지 방법이 있다.
bucket
를 만들고 bucket
의 초기값은 주어진 리스트(arr)의 첫번째 값에 해당하는 인덱스의 값을 1로 바꾸어 준다.bucket[arr[0]] += 1
bucket
을 돌면서 0이 아닐 때, 즉 해당 인덱스의 값이 계산 결과로써 주어졌을 때 플러스 연산과 마이너스 연산을 각각 수행한 뒤, 범위에 맞는지를 확인하고 나서 temp
의 해당 인덱스에 bucket[i]
의 값을 추가하여 준다. for i in range(len(bucket)):
if bucket[i] != 0:
a = i + arr[number]
b = i - arr[number]
if a <= 20:
temp[a] += bucket[i]
if 0 <= b:
temp[b] += bucket[i]
# 백준 5557번 1학년
from sys import stdin
input = stdin.readline
n = int(input())
arr = list(map(int, input().split()))
ans = arr.pop()
result = 0
bucket = [0] * 21
bucket[arr[0]] += 1
def answer(number, bucket, ans, result):
if number < n-1: # 맨 마지막 원소 제외
temp = [0] * 21
for i in range(len(bucket)):
if bucket[i] != 0:
a = i + arr[number]
b = i - arr[number]
if a <= 20:
temp[a] += bucket[i]
if 0 <= b:
temp[b] += bucket[i]
if number != n-2:
answer(number+1, temp, ans, result)
else:
print(temp[ans])
return
answer(1, bucket, ans, result)