ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] λ°±μ€€ - 7569 ν† λ§ˆν† 
    __Python/__Algorithm 2022. 2. 12. 12:41

      λ¬Έμ œ

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

     

    πŸ”Ή λ¬Έμ œ

    철수의 ν† λ§ˆν†  농μž₯μ—μ„œλŠ” ν† λ§ˆν† λ₯Ό λ³΄κ΄€ν•˜λŠ” 큰 μ°½κ³ λ₯Ό 가지고 μžˆλ‹€. ν† λ§ˆν† λŠ” μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같이 격자λͺ¨μ–‘ μƒμžμ˜ 칸에 ν•˜λ‚˜μ”© 넣은 λ‹€μŒ, μƒμžλ“€μ„ 수직으둜 μŒ“μ•„ μ˜¬λ €μ„œ 창고에 λ³΄κ΄€ν•œλ‹€.

    창고에 λ³΄κ΄€λ˜λŠ” ν† λ§ˆν† λ“€ μ€‘μ—λŠ” 잘 읡은 것도 μžˆμ§€λ§Œ, 아직 읡지 μ•Šμ€ ν† λ§ˆν† λ“€λ„ μžˆμ„ 수 μžˆλ‹€. 보관 ν›„ ν•˜λ£¨κ°€ μ§€λ‚˜λ©΄, 읡은 ν† λ§ˆν† λ“€μ˜ μΈμ ‘ν•œ 곳에 μžˆλŠ” 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ€ 읡은 ν† λ§ˆν† μ˜ 영ν–₯을 λ°›μ•„ 읡게 λœλ‹€. ν•˜λ‚˜μ˜ ν† λ§ˆν† μ— μΈμ ‘ν•œ 곳은 μœ„, μ•„λž˜, μ™Όμͺ½, 였λ₯Έμͺ½, μ•ž, λ’€ μ—¬μ„― λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ₯Ό μ˜λ―Έν•œλ‹€. λŒ€κ°μ„  λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ“€μ—κ²ŒλŠ” 영ν–₯을 주지 λͺ»ν•˜λ©°, ν† λ§ˆν† κ°€ 혼자 μ €μ ˆλ‘œ μ΅λŠ” κ²½μš°λŠ” μ—†λ‹€κ³  κ°€μ •ν•œλ‹€. μ² μˆ˜λŠ” 창고에 λ³΄κ΄€λœ ν† λ§ˆν† λ“€μ΄ 며칠이 μ§€λ‚˜λ©΄ λ‹€ 읡게 λ˜λŠ”μ§€ κ·Έ μ΅œμ†Œ 일수λ₯Ό μ•Œκ³  μ‹Άμ–΄ ν•œλ‹€.

    ν† λ§ˆν† λ₯Ό 창고에 λ³΄κ΄€ν•˜λŠ” 격자λͺ¨μ–‘μ˜ μƒμžλ“€μ˜ 크기와 읡은 ν† λ§ˆν† λ“€κ³Ό 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ˜ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 며칠이 μ§€λ‚˜λ©΄ ν† λ§ˆν† λ“€μ΄ λͺ¨λ‘ μ΅λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. 단, μƒμžμ˜ 일뢀 μΉΈμ—λŠ” ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

     

    πŸ”Ή μž…λ ₯

    첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,Nκ³Ό μŒ“μ•„μ˜¬λ €μ§€λŠ” μƒμžμ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” Hκ°€ 주어진닀. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, 1 ≤ H ≤ 100 이닀. λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” κ°€μž₯ λ°‘μ˜ μƒμžλΆ€ν„° κ°€μž₯ μœ„μ˜ μƒμžκΉŒμ§€μ— μ €μž₯된 ν† λ§ˆν† λ“€μ˜ 정보가 주어진닀. 즉, λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” ν•˜λ‚˜μ˜ μƒμžμ— λ‹΄κΈ΄ ν† λ§ˆν† μ˜ 정보가 주어진닀. 각 μ€„μ—λŠ” μƒμž κ°€λ‘œμ€„μ— λ“€μ–΄μžˆλŠ” ν† λ§ˆν† λ“€μ˜ μƒνƒœκ°€ M개의 μ •μˆ˜λ‘œ 주어진닀. μ •μˆ˜ 1은 읡은 ν† λ§ˆν† , μ •μˆ˜ 0 은 읡지 μ•Šμ€ ν† λ§ˆν† , μ •μˆ˜ -1은 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ€ 칸을 λ‚˜νƒ€λ‚Έλ‹€. μ΄λŸ¬ν•œ N개의 쀄이 H번 λ°˜λ³΅ν•˜μ—¬ 주어진닀.

    ν† λ§ˆν† κ°€ ν•˜λ‚˜ 이상 μžˆλŠ” 경우만 μž…λ ₯으둜 주어진닀.

    πŸ”Ή μΆœλ ₯

    μ—¬λŸ¬λΆ„μ€ ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡을 λ•ŒκΉŒμ§€ μ΅œμ†Œ 며칠이 κ±Έλ¦¬λŠ”μ§€λ₯Ό κ³„μ‚°ν•΄μ„œ 좜λ ₯ν•΄μ•Ό ν•œλ‹€. λ§Œμ•½, μ €μž₯될 λ•ŒλΆ€ν„° λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” μƒνƒœμ΄λ©΄ 0을 좜λ ₯ν•΄μ•Ό ν•˜κ³ , ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ§€λŠ” λͺ»ν•˜λŠ” 상황이면 -1을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

     

      ν’€μ΄ 방법

     

    πŸ”Ή κ·Έλž˜ν”„ 탐색

    πŸ”Ή BFS (λ„ˆλΉ„μš°μ„ νƒμƒ‰)

    1. λͺ¨λ‘ 읡은 ν† λ§ˆν† μ΄κ±°λ‚˜(1), ν† λ§ˆν† κ°€ ν•˜λ‚˜λ„ μ—†λŠ” 경우(-1)μ—λŠ” exit()을 톡해 λ°”λ‘œ ν”„λ‘œκ·Έλž¨ μ’…λ£Œ
    2. μ•ˆμ΅μ€ ν† λ§ˆν† (0)λŠ” chkλ₯Ό 톡해 count+1, BFS둜 λ°©λ¬Έμ‹œ count-1
    3. μΈμ ‘ν•œ ν† λ§ˆν† κ°€ 읡지 μ•Šμ•˜λ‹€λ©΄, ν˜„μž¬ ν† λ§ˆν†  μΌμžμ—μ„œ 1일 μΆ”κ°€, q에 λ„£μ–΄ λ°©λ¬Έ 처리
    4. BFS μ’…λ£Œ ν›„ μ—¬μ „νžˆ chkκ°€ 0이 μ•„λ‹ˆλΌλ©΄, μ•ˆμ΅μ€ ν† λ§ˆν† (0)κ°€ 쑴재 > 좜λ ₯ : -1
    5. BFS μ’…λ£Œ ν›„ λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ—ˆλ‹€λ©΄ > 좜λ ₯ : λ§ˆμ§€λ§‰μ— 읡은 ν† λ§ˆν† μ˜ 일자 -1

    πŸ”Ή ν‹€λ ΈμŠ΅λ‹ˆλ‹€ ν•΄κ²° > κ²Œμ‹œνŒ λ°˜λ‘€λ“€ μ°Έκ³  (3차원 인덱슀 μ ‘κ·Ό μ—λŸ¬ -- λ²”μœ„ 잘λͺ» 지정) 

        λ°˜λ‘€ πŸ”½

    더보기

    3 3 1
    1 1 0
    0 0 0
    0 0 0
    μ •λ‹΅ > 3  
    5 3 1
    1 1 1 1 1
    1 1 1 1 1
    1 1 1 1 1
    μ •λ‹΅ > 0  
    2 2 6
    0 0
    0 0
    0 0
    0 0
    0 1
    0 0
    0 0
    0 0
    0 0
    0 0
    0 0
    0 0
    μ •λ‹΅ > 5 μ‹€νŒ¨
    처음 좜λ ₯: -1

     

      κ΅¬ν˜„ μ½”λ“œ

    import sys
    from collections import deque
    def bfs(queue,chk):
        while q:
            f,x,y = q.popleft()
    
            df = [0,0,0,0,1,-1]
            dx = [-1,1,0,0,0,0]
            dy = [0,0,-1,1,0,0]    
            for k in range(6):
                nf = f + df[k]; nx = x + dx[k]; ny = y + dy[k]
    
                if 0<=nf<h and 0<=nx<m and 0<=ny<n and box[nf][nx][ny]==0:
                    box[nf][nx][ny] = box[f][x][y] +1
                    q.append([nf,nx,ny])
                    chk-=1
    
        if chk != 0:
            return -1
        return box[f][x][y]-1
    
    n,m,h = map(int, sys.stdin.readline().split())
    box = [[list(map(int, sys.stdin.readline().split())) for _ in range(m)] for _ in range(h)]
    q = deque([])
    chk = 0
    for f in range(h):
        for i in range(m):
            for j in range(n):
                if box[f][i][j] == 1:
                    q.append([f,i,j])
                elif box[f][i][j] == 0:
                    chk += 1
    if chk == 0:
        print(0)
        exit(0)
        
    print(bfs(q,chk))

     

      μ‹€ν–‰ κ²°κ³Ό

     

      πŸ’‘

     

    πŸ”Ή exit(0)을 톡해 λ°”λ‘œ ν”„λ‘œκ·Έλž¨μ„ 정상 μ’…λ£Œμ‹œν‚¬ 수 μžˆλ‹€.

        https://www.delftstack.com/ko/howto/python/python-exit-program/

     

     

     

     

     

     

    728x90

    λŒ“κΈ€

Designed by Tistory.