흰 스타렉스에서 내가 내리지

[BOJ] (DFS) 1248번 맞혀봐 본문

Problem Solving

[BOJ] (DFS) 1248번 맞혀봐

주씨. 2022. 2. 4. 19:28
728x90

 

백트래킹과 dfs로 푸는 문제다.

처음에 귀찮아서 permutation으로 풀었는데, 역시나 시관초과가 나왔다. 

 

import sys

n = int(input())
data = list(input())
arr = [[None]*n for _ in range(n)]
k = 0
for i in range(n):
    for j in range(i, n):
        arr[i][j] = data[k]
        k+=1
        
sol = []
def solve(i):
    if i == n:
        print(*sol)
        sys.exit()
        return
    
    if arr[i][i] == '-':
        cand = [j for j in range(-10, 0)]
    elif arr[i][i] == '+':
        cand = [j for j in range(1, 11)]
    elif arr[i][i] == '0':
        cand = [0]
        
    for k in cand:
        sol.append(k)
        isOK = True
        
        for j in range(i+1):
            _sum = sum(sol[j:i+1])
            if _sum <= 0 and arr[j][i] == '+':
                isOK = False
                break  
            elif _sum >= 0 and arr[j][i] == '-':
                isOK = False
                break
            elif _sum != 0 and arr[j][i] == '0':
                isOK = False
                break
                
        if isOK:
            solve(i+1)        
        
        sol.pop()

            
solve(0)

 

 

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

 

1248번: 맞춰봐

첫째 줄에 수열의 크기 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 N(N+1)/2 길이의 문자열이 주어진다. 처음 N개의 문자는 부호 배열의 첫 번째 줄에 해당하고, 다음 N-1개의 문

www.acmicpc.net