PS (Problem Solving)/Baekjoon

[백준] 19949. 영재의 시험

캐럿노트 2022. 4. 21. 23:15

문제

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

 

19949번: 영재의 시험

컴퓨터공학과 학생인 영재는 이번 학기에 알고리즘 수업을 수강한다. 평소에 자신의 실력을 맹신한 영재는 시험 전날까지 공부를 하지 않았다. 당연하게도 문제를 하나도 풀지 못하였지만 다행

www.acmicpc.net

 

설계

- DFS, 백트래킹

- level(수준): 10 / branch: 5

 

백트래킹을 적용했으나 파이썬으로 제출했을 경우 시간초과에 걸렸다. pypy 로 제출하여 통과했으나 메모리나 시간이 많이 소요되어 시간복잡도를 좀 더 줄여야 하는 코드라고 생각한다.

def dfs(level):
    global cnt

    if level == 10:
        score = 0
        for i in range(10):     # 10문제를 모두 풀었으면 몇 문제가 맞았는지 검사
            if arr[i] == path[i]:
                score += 1
            if i >= 2:          # 백트래킹, 3개의 연속된 문제의 답은 같지 않게 한다.
                if path[i] == path[i - 1] == path[i - 2]:
                    return
        if score >= 5:          # 5점 이상인 경우를 카운트 한다.
            cnt += 1
        return

    for i in range(1, 6):
        path.append(i)
        dfs(level+1)
        path.pop()      # 원상복구

arr = list(map(int, input().split()))
path = []
cnt = 0         # 5점 이상일 경우 카운트한다.

dfs(0)
print(cnt)