🌞Algorithm/πŸ”₯Baekjoon

[Baekjoon] 7569_ν† λ§ˆν† 

λΏŒμ•Ό._. 2022. 3. 22. 22:40

Gold V

문제(좜처: 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을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

 

 

문제 풀이

   - my solution

import sys
from collections import deque

def bfs(graph, queue, visited, depth, n):
    dx=[-1,1,0,0, n, -n] # 상,ν•˜,쒌,우,μ•„λž˜μΈ΅,μœ„μΈ΅
    dy=[0,0,-1,1, 0, 0]
    while queue:
        temp=queue.popleft()
        for i in range(6):
            x=temp[0]+dx[i]
            y=temp[1]+dy[i]
            flag=True
            if x>=0 and x<len(graph) and y>=0 and y<len(graph[0]): #ν† λ§ˆν†  μ°½κ³  λ²”μœ„ μ•ˆ
                if visited[x][y]==0 : # 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄
                    if dx[i]!=n and dx[i]!=-n: # μƒν•˜μ’Œμš°==같은 μΈ΅
                        if temp[0]//n != x//n:
                            flag=False
                    if flag==True:
                        queue.append([x,y])
                        visited[x][y]=1
                        depth[x][y]=depth[temp[0]][temp[1]]+1

if __name__ =='__main__':
    m,n,h=map(int ,sys.stdin.readline().split())

    graph=[]
    for i in range(n*h):
        graph.append(list(map(int ,sys.stdin.readline().split())))

    visited=[[0]*m for i in range(n*h)] # λ°©λ¬Έ μ—¬λΆ€
    depth=[[0]*m for i in range(n*h)] # day
    start=deque([])

    for i in range(n*h):
        for j in range(m):
            if graph[i][j]==-1: # ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•ŠμŒ
                visited[i][j]=1
            if visited[i][j]==0 and graph[i][j]==1: # λ°©λ¬Έx, 읡은 ν† λ§ˆν† 
                start.append([i,j])
                visited[i][j]=1
    bfs(graph, start, visited, depth, n)

    answer=-1
    flag=False # λͺ¨λ‘ 읡지 λͺ»ν•˜λŠ” 경우 νŒλ³„
    for i in range(n*h):
        if flag == True:
            answer=-1
            break
        for j in range(m):
            if visited[i][j]==0: # 읡지 λͺ»ν•œ ν† λ§ˆν† 
                flag=True
                break
            else: # μ΅œμ†Œ λ‚ μ§œ κ΅¬ν•˜κΈ°
                if answer<depth[i][j]:
                    answer=depth[i][j]

    print(answer)

 

  • bfs (ν† λ§ˆν†  정보,  queue , λ°©λ¬Έ μ—¬λΆ€ list, day, n)
    : dx, dy = 상, ν•˜, 쒌, 우, μœ„μΈ΅, μ•„λž˜μΈ΅ 탐색
    : queueκ°€ 빌 λ•ŒκΉŒμ§€ 반볡 -> 제일 처음 값을 pop -> 상, ν•˜, 쒌, 우, μœ„μΈ΅, μ•„λž˜μΈ΅μ„ ν™•μΈν•˜μ—¬ ν† λ§ˆν†  μƒμž λ²”μœ„μ— μ†ν•˜λ©΄ -> 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ -> μƒν•˜μ’Œμš°μΈ 경우 같은 측이라면 queue에 μΆ”κ°€, λ°©λ¬Έ o, 이동할 μœ„μΉ˜μ˜ depth = ν˜„μž¬ μœ„μΉ˜μ˜ depth +1 
  • main
    : m, n, h μž…λ ₯
    : ν† λ§ˆν†  정보 μž…λ ₯
    : graph = ν† λ§ˆν†  정보
     visited = λ°©λ¬Έ μ—¬λΆ€ 
     depth = μ΅œμ†Œ 일수 κ΅¬ν•˜κΈ° μœ„ν•œ day μ €μž₯
     answer= μ΅œμ†Œ λ‚ μ§œ
    : ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ€ 곳은 bfs ν•¨μˆ˜μ—μ„œ 영ν–₯λ°›μ§€ μ•Šλ„λ‘ visitedλ₯Ό 1둜 μ„€μ •
    : ν† λ§ˆν†  정보 전체λ₯Ό νƒμƒ‰ν•˜μ—¬ 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜μœΌλ©° 읡은 ν† λ§ˆν† λ₯Ό queue에 μΆ”κ°€ 및 λ°©λ¬Έ o
    : bfs ν•¨μˆ˜ 호좜
    : λ°©λ¬Έ μ—¬λΆ€ listλ₯Ό 전체 νƒμƒ‰ν•˜μ—¬ 0이 μ‘΄μž¬ν•˜λ©΄ = ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡지 λͺ»ν•˜λŠ” 경우 -> -1 좜λ ₯
     0이 μ—†λ‹€λ©΄ depth μ€‘μ—μ„œ κ°€μž₯ 큰 κ°’ μ°Ύμ•„μ„œ 좜λ ₯ = μ΅œμ†Œ 일수

λ°”λ‘œ μ•ž λ¬Έμ œμ—μ„œ ν•΄κ²°ν–ˆλ˜ 7576 ν† λ§ˆν†  λ¬Έμ œμ™€ 맀우 λΉ„μŠ·ν•œ λ¬Έμ œμ˜€λ‹€.

7576 μ—μ„œλŠ” ν† λ§ˆν†  μ°½κ³ κ°€ ν•œ μΈ΅μ΄μ—ˆλ‹€λ©΄ 7569 μ—μ„œλŠ” ν† λ§ˆν†  μ°½κ³ κ°€ μ—¬λŸ¬ μΈ΅ μžˆλ‹€λŠ” 점이 λ‹€λ₯Έ 것 λ§κ³ λŠ” λ˜‘κ°™μ•˜λ‹€.

μƒν•˜μ’Œμš°λ₯Ό νŒλ³„ν•  λ•Œ 같은 μΈ΅ ν† λ§ˆν†  창고인지 ν™•μΈν•˜λŠ” κ²ƒλ§Œ μΆ”κ°€ν•˜λ©΄ ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€. 

 

 

❓ μ²˜μŒμ— μ™œ ν‹€λ ΈλŠ”κ°€?

μ—¬λŸ¬ 측의 ν† λ§ˆν†  μ°½κ³ κ°€ 있기 λ•Œλ¬Έμ— 상, ν•˜, 쒌, 우, μœ„μΈ΅, μ•„λž˜μΈ΅μ„ νŒλ³„ν•  λ•Œ κ³ λ €ν•΄μ•Ό ν•  점을 놓쳀기 λ•Œλ¬Έμ΄λ‹€. 상, ν•˜, 쒌, 우 νŒλ³„ μ‹œ λ‹€λ₯Έ 측인데 단지, ν† λ§ˆν†  μ°½κ³  λ²”μœ„μ— λ§žλ‹€κ³  계산해주면 λ‹€λ₯Έ κ²°κ³Όκ°€ λ‚˜μ˜€κΈ° λ•Œλ¬Έμ΄λ‹€. κ·ΈλŸ¬λ―€λ‘œ 상, ν•˜, 쒌, 우 νŒλ³„ μ‹œ 같은 측의 ν† λ§ˆν†  창고인지λ₯Ό νŒλ³„ν•˜λŠ” if 문을 λ„£μ–΄ 톡과할 수 μžˆμ—ˆλ‹€.

 

 


μƒκ°πŸ€”

 

λ°”λ‘œ μ•žμ— ν’€μ—ˆλ˜ λ¬Έμ œμ™€ μ½”λ“œλ„ λΉ„μŠ·ν•˜μ—¬ λ¨Έμ“±ν•˜κΈ΄ ν•˜μ§€λ§Œ κ·Έλž˜λ„ ν†΅κ³Όν–ˆλ‹€!

λ””λ²„κΉ…ν•˜λŠλΌ νž˜λ“€μ—ˆλ‹€ πŸ˜₯