Algorithm/Baekjoon

0529_백준 15684번 : 사다리 조작/ 완전탐색(Brute-Force)/ Python

rmsidgkrl 2020. 5. 29. 16:31
728x90
반응형

[문제 접근]

- 브루트포스(완전탐색) 문제

- 사다리를 놓는 함수와 사다리를 놓은 후 모든 세로선이 자기 번호로 도착하는 지 확인하는 함수 두 가지로 프로그램을 짰다. 

[코드 구현]

# 사다리에 가로선을 놓는 함수
def dfs(start, cnt):
    global res
    if cnt == min_cnt:
        if check():
            res = cnt
        return
    for i in range(start, h):
        for j in range(n-1):
            # ij 위치에 사다리가 있지 않고, 전후로도 사다리가 없으면
            if not ladder[i][j-1] + ladder[i][j] + ladder[i][j+1]:
                # 사다리 놓기
                ladder[i][j] = 1
                dfs(i, cnt+1)
                # 함수 재귀 끝나면 사다리 다시 빼기(원상복구)
                ladder[i][j] = 0

# 사다리 가로선 추가 후, 모든 세로선이 자기 번호로 내려오는 지 확인하는 함수
def check():
    # h행 n열, 1열부터 시작
    for j in range(n):
        tmp = j
        for i in range(h):
            if ladder[i][tmp]: # 이어져 있으면 오른쪽으로 열 한칸 이동
                tmp += 1
            elif ladder[i][tmp-1]: # 왼쪽방향이 이어져 있는 지 확인
                tmp -= 1 # 왼쪽으로 열 이동

        # 모든 행을 거친 뒤 자기 원래 열 번호(j)로 돌아오지 않으면 False
        if tmp != j:
            return False
    # 모든 열이 사다리를 타고 자기 열 번호로 돌아온다면 True 반환
    return True

n, m, h = map(int, input().split())
ladder = [[0]*n for _ in range(h)]
for i in range(m):
    # a 행 b 열
    a, b = map(int, input().split())
    ladder[a-1][b-1] = 1

res = 10000
for min_cnt in range(4):
    dfs(0, 0)
    if res != 10000:
        print(res) # 최솟값 출력
        break
else:
    print(-1) # 불가능한 경우, cnt가 4이상인 경우 -1 출력
    

[문제 출처]

백준 15684번 사다리 조작 https://www.acmicpc.net/problem/15684

 

15684번: 사다리 조작

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

www.acmicpc.net

 

반응형