πŸ¦₯ μ½”ν…Œ/BAEKJOON

[BAEKJOON python] 15684_사닀리 μ‘°μž‘

μ§•μ§•μ•ŒνŒŒμΉ΄ 2022. 10. 13. 16:50
728x90
λ°˜μ‘ν˜•
사닀리 κ²Œμž„μ€ N개의 μ„Έλ‘œμ„ κ³Ό M개의 κ°€λ‘œμ„ μœΌλ‘œ 이루어져 μžˆλ‹€.
μΈμ ‘ν•œ μ„Έλ‘œμ„  μ‚¬μ΄μ—λŠ” κ°€λ‘œμ„ μ„ 놓을 수 μžˆλŠ”λ°,
각각의 μ„Έλ‘œμ„ λ§ˆλ‹€ κ°€λ‘œμ„ μ„ 놓을 수 μžˆλŠ” μœ„μΉ˜μ˜ κ°œμˆ˜λŠ” H이고, λͺ¨λ“  μ„Έλ‘œμ„ μ΄ 같은 μœ„μΉ˜λ₯Ό κ°–λŠ”λ‹€

μ΄ˆλ‘μ„ μ€ μ„Έλ‘œμ„ μ„ λ‚˜νƒ€λ‚΄κ³ , μ΄ˆλ‘μ„ κ³Ό 점선이 κ΅μ°¨ν•˜λŠ” 점은 κ°€λ‘œμ„ μ„ 놓을 수 μžˆλŠ” 점
κ°€λ‘œμ„ μ€ μΈμ ‘ν•œ 두 μ„Έλ‘œμ„ μ„ μ—°κ²°ν•΄μ•Ό ν•œλ‹€.
단, 두 κ°€λ‘œμ„ μ΄ μ—°μ†ν•˜κ±°λ‚˜ μ„œλ‘œ μ ‘ν•˜λ©΄ μ•ˆ λœλ‹€. 또, κ°€λ‘œμ„ μ€ 점선 μœ„μ— μžˆμ–΄μ•Ό ν•œλ‹€.

κ°€λ‘œμ„ μ€ μœ„μ˜ κ·Έλ¦Όκ³Ό 같이 μΈμ ‘ν•œ 두 μ„Έλ‘œμ„ μ„ μ—°κ²°ν•΄μ•Ό ν•˜κ³ , κ°€λ‘œμ„ μ„ 놓을 수 μžˆλŠ” μœ„μΉ˜λ₯Ό μ—°κ²°ν•΄μ•Ό ν•œλ‹€.
사닀리 κ²Œμž„μ€ 각각의 μ„Έλ‘œμ„ λ§ˆλ‹€ κ²Œμž„μ„ μ§„ν–‰ν•˜κ³ , μ„Έλ‘œμ„ μ˜ κ°€μž₯ μœ„μ—μ„œλΆ€ν„° μ•„λž˜ λ°©ν–₯으둜 λ‚΄λ €κ°€μ•Ό ν•œλ‹€.
μ΄λ•Œ, κ°€λ‘œμ„ μ„ λ§Œλ‚˜λ©΄ κ°€λ‘œμ„ μ„ μ΄μš©ν•΄ μ˜† μ„Έλ‘œμ„ μœΌλ‘œ μ΄λ™ν•œ λ‹€μŒ, μ΄λ™ν•œ μ„Έλ‘œμ„ μ—μ„œ μ•„λž˜ λ°©ν–₯으둜 이동해야 ν•œλ‹€.
사닀리에 κ°€λ‘œμ„ μ„ μΆ”κ°€ν•΄μ„œ, 사닀리 κ²Œμž„μ˜ κ²°κ³Όλ₯Ό μ‘°μž‘ν•˜λ €κ³  ν•œλ‹€.
μ΄λ•Œ, i번 μ„Έλ‘œμ„ μ˜ κ²°κ³Όκ°€ i번이 λ‚˜μ™€μ•Ό ν•œλ‹€.
μΆ”κ°€ν•΄μ•Ό ν•˜λŠ” κ°€λ‘œμ„  개수의 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±

첫째 쀄에 μ„Έλ‘œμ„ μ˜ 개수 N, κ°€λ‘œμ„ μ˜ 개수 M, μ„Έλ‘œμ„ λ§ˆλ‹€ κ°€λ‘œμ„ μ„ 놓을 수 μžˆλŠ” μœ„μΉ˜μ˜ 개수 Hκ°€ 주어진닀. (2 ≤ N ≤ 10, 1 ≤ H ≤ 30, 0 ≤ M ≤ (N-1)×H)
λ‘˜μ§Έ 쀄뢀터 M개의 μ€„μ—λŠ” κ°€λ‘œμ„ μ˜ 정보가 ν•œ 쀄에 ν•˜λ‚˜μ”© 주어진닀.
    κ°€λ‘œμ„ μ˜ μ •λ³΄λŠ” 두 μ •μˆ˜ aκ³Ό b둜 λ‚˜νƒ€λ‚Έλ‹€. (1 ≤ a ≤ H, 1 ≤ b ≤ N-1)
    b번 μ„Έλ‘œμ„ κ³Ό b+1번 μ„Έλ‘œμ„ μ„ a번 점선 μœ„μΉ˜μ—μ„œ μ—°κ²°ν–ˆλ‹€λŠ” 의미
κ°€μž₯ μœ„μ— μžˆλŠ” μ μ„ μ˜ λ²ˆν˜ΈλŠ” 1번이고, μ•„λž˜λ‘œ λ‚΄λ €κ°ˆ λ•Œλ§ˆλ‹€ 1이 μ¦κ°€
    μ„Έλ‘œμ„ μ€ κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” κ²ƒμ˜ λ²ˆν˜Έκ°€ 1번이고, 였λ₯Έμͺ½μœΌλ‘œ 갈 λ•Œλ§ˆλ‹€ 1이 μ¦κ°€ν•œλ‹€.
μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” κ°€λ‘œμ„ μ΄ μ„œλ‘œ μ—°μ†ν•˜λŠ” κ²½μš°λŠ” μ—†λ‹€

i번 μ„Έλ‘œμ„ μ˜ κ²°κ³Όκ°€ i번이 λ‚˜μ˜€λ„λ‘ 사닀리 κ²Œμž„μ„ μ‘°μž‘ν•˜λ €λ©΄, μΆ”κ°€ν•΄μ•Ό ν•˜λŠ” κ°€λ‘œμ„  개수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯
    λ§Œμ•½, 정닡이 3보닀 큰 값이면 -1을 좜λ ₯ν•œλ‹€. 또, λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λ„ -1을 좜λ ₯
def check() :
    for i in range(N) :     # μ„Έλ‘œμ„  검사
        k = i   # μ΄λ™ν•˜λŠ” κ°€λ‘œμ„ 
        for j in range(H) :
            if visited[j][k] :     # κ°€λ‘œμ„  쑴재 -> 였λ₯Έμͺ½
                k += 1
            elif k > 0 and visited[j][k-1] :       # κ°€λ‘œμ„  μ™Όμͺ½μ— 쑴재 -> μ™Όμͺ½μœΌλ‘œ
                k -= 1
        if k != i :
            return False
    return True

def dfs(cnt, x, y ) :
    global answer
    if check() :
        answer = min(answer, cnt)
        return
    
    elif cnt == 3 or answer <= cnt :
        return

    for i in range(x, H) :
        # ν–‰ 탐색
        if i == x :
            k = y
        else :
            k = 0

        for j in range(k, N - 1):
            # μ—΄ 탐색
            if not visited[i][j] and not visited[i][j+1] :
                if j > 0 and visited[i][j - 1] :
                    continue
            
                visited[i][j] = True
                dfs(cnt+1, i, j +2)
                visited[i][j] = False

# μ„Έλ‘œμ„  개수, κ°€λ‘œμ„  개수, μ„Έλ‘œμ„  λ§ˆλ‹€ κ°€λ‘œμ„  놓을 수 μžˆλŠ” μœ„μΉ˜κ°œμˆ˜
N, M, H = map(int, input().split())    

visited = [[False] * N for _ in range(H)]       # λ°©λ¬Έ 확인

if M == 0 :  # κ°€λ‘œμ„  μ—†μŒ
    print(0)    # μ΅œμ†Œκ°’ 0
    exit(0)

for _ in range(M) :
    a, b = map(int, input().split())    # κ°€λ‘œμ„  정보
    visited[a-1][b-1] = True
answer = 4

dfs(0, 0, 0)

if answer < 4 :
    print(answer)
else :
    print(-1)
728x90
λ°˜μ‘ν˜•