PS/Python

[백준] 15684 - 사다리 조작 (파이썬, Python)

w00se 2021. 9. 15. 00:38

https://pixabay.com/ko/photos/우산-햇빛-여자-비-빛-6239364/

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

 

15684번: 사다리 조작

사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선

www.acmicpc.net

 

전체 코드

제출 언어: PyPy3

시간: 1400ms

import sys

def check_is_success():
    global N, H, mat

    is_success = True

    for i in range(1, N+1):
        d = 0
        idx_left, idx_right = i-1, i

        for j in range(H):
            if mat[j][idx_left]:
                d -= 1
                idx_left -= 1
                idx_right -= 1   
                
            elif mat[j][idx_right]:
                d += 1
                idx_left += 1
                idx_right += 1
        
        if d != 0:
            is_success = False
            break
    
    return is_success

def solution(cur_cnt, x, y):
    global answer, N, H

    if check_is_success():
        if answer == -1 or answer > cur_cnt:
            answer = cur_cnt
        
        return

    if cur_cnt >= 3 or (answer != -1 and answer <= cur_cnt):
        return
    
    for i in range(y, H):
        sc = x if i == y else 1

        for j in range(sc, N):
            if mat[i][j]:
                continue
            
            elif mat[i][j-1] or mat[i][j+1]:
                continue

            mat[i][j] = True
            solution(cur_cnt+1, j+1, i)
            mat[i][j] = False
            
if __name__ == "__main__":
    N, M, H = map(int, sys.stdin.readline().strip().split())

    mat = [ [ False ] * (N+1) for _ in range(H) ]

    for _ in range(M):
        a, b = map(int, sys.stdin.readline().strip().split())
        mat[a-1][b] = True

    answer = -1

    solution(0, 1, 0)

    print(answer)

읽어 주셔서 감사합니다 :)

틀린 부분이 있다면 댓글로 편히 알려주세요😊