We will find a way, we always have.

-interstellar

Problem Solving/λ°±μ€€

[λ°±μ€€] 13565번: 침투 - 파이썬

Redddy 2022. 6. 9. 23:11

πŸ”ˆ 문제

μΈμ œλŒ€ν•™κ΅ 생화학연ꡬ싀에 μž¬μ§μ€‘μΈ μ„κ΅μˆ˜λŠ” μ „λ₯˜κ°€ 침투(percolate) ν•  수 μžˆλŠ” μ„¬μœ  λ¬Όμ§ˆμ„ κ°œλ°œν•˜κ³  μžˆλ‹€. 이 μ„¬μœ  λ¬Όμ§ˆμ€ 2차원 M × N 격자둜 ν‘œν˜„λ  수 μžˆλ‹€. νŽΈμ˜μƒ 2차원 격자의 μœ„μͺ½μ„ λ°”κΉ₯μͺ½(outer side), μ•„λž˜μͺ½μ„ μ•ˆμͺ½(inner side)라고 μƒκ°ν•˜κΈ°λ‘œ ν•œλ‹€. λ˜ν•œ 각 κ²©μžλŠ” 검은색 μ•„λ‹ˆλ©΄ 흰색인데, 검은색은 μ „λ₯˜λ₯Ό μ°¨λ‹¨ν•˜λŠ” λ¬Όμ§ˆμž„μ„ λœ»ν•˜κ³  흰색은 μ „λ₯˜κ°€ 톡할 수 μžˆλŠ” λ¬Όμ§ˆμž„μ„ λœ»ν•œλ‹€. μ „λ₯˜λŠ” μ„¬μœ  물질의 κ°€μž₯ λ°”κΉ₯μͺ½ 흰색 κ²©μžλ“€μ— κ³΅κΈ‰λ˜κ³ , μ΄ν›„μ—λŠ” μƒν•˜μ’Œμš°λ‘œ μΈμ ‘ν•œ 흰색 κ²©μžλ“€λ‘œ 전달될 수 μžˆλ‹€.

κΉ€ κ΅μˆ˜κ°€ κ°œλ°œν•œ μ„¬μœ  λ¬Όμ§ˆμ„ λ‚˜νƒ€λ‚΄λŠ” 정보가 2차원 격자 ν˜•νƒœλ‘œ μ£Όμ–΄μ§ˆ λ•Œ, λ°”κΉ₯μͺ½μ—μ„œ 흘렀 μ€€ μ „λ₯˜κ°€ μ•ˆμͺ½κΉŒμ§€ 침투될 수 μžˆλŠ”μ§€ μ•„λ‹Œμ§€λ₯Ό νŒλ‹¨ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

예λ₯Ό λ“€μ–΄, Figure 1(a) μ—μ„œλŠ” λ°”κΉ₯μͺ½μ—μ„œ κ³΅κΈ‰λœ μ „λ₯˜κ°€ μ•ˆμͺ½κΉŒμ§€ μΉ¨νˆ¬ν•˜μ§€λ§Œ, Figure 1(b)μ—μ„œλŠ” 그렇지 λͺ»ν•œλ‹€.

 

πŸ“μž…λ ₯

첫째 μ€„μ—λŠ” 격자의 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ”  M (2 ≤ M ≤ 1,000) κ³Ό N (2 ≤ N ≤ 1,000) 이 주어진닀. M쀄에 κ±Έμ³μ„œ, N개의 0 λ˜λŠ” 1 이 곡백 없이 주어진닀. 0은 μ „λ₯˜κ°€ 잘 ν†΅ν•˜λŠ” 흰색, 1은 μ „λ₯˜κ°€ ν†΅ν•˜μ§€ μ•ŠλŠ” κ²€μ€μƒ‰ κ²©μžμž„μ„ λœ»ν•œλ‹€.

 

πŸ“‘μΆœλ ₯

λ°”κΉ₯μ—μ„œ ν˜λ €μ€€ μ „λ₯˜κ°€ μ•ˆμͺ½κΉŒμ§€ 잘 μ „λ‹¬λ˜λ©΄ YESλ₯Ό 좜λ ₯ν•œλ‹€.그렇지 μ•ŠμœΌλ©΄ NOλ₯Ό 좜λ ₯ν•œλ‹€.

 

πŸ“š 문제 해석

첫번째 쀄 λ§ˆμ§€λ§‰ μ€„λ‘œ 갈 수 μžˆλŠ”μ§€ μ²΄ν¬ν•˜λ©΄ λ˜λŠ” λ¬Έμ œμ˜€λ‹€. μœ„μ—μ„œ μ•„λž˜λ‘œ λ‚΄λ €κ°€λ‹ˆκΉŒ 이동방ν–₯을 μ™Όμͺ½, 였λ₯Έμͺ½, μ•„λž˜ μ΄λ ‡κ²Œ 3κ°€μ§€λ§Œ λ‘μ—ˆλ‹€! κ·ΈλŸ¬λ‚˜ 100%μ—μ„œ ν‹€λ ΈμŠ΅λ‹ˆλ‹€ νŒμ •μ„ λ°›μ•˜λ‹€. λ°‘μ—μ„œ λ‚΄λ €κ°”λ‹€κ°€ λ‹€μ‹œ μœ„λ‘œ μ˜¬λΌκ°€λŠ” 경우λ₯Ό μƒκ°ν•˜μ§€ λͺ»ν–ˆλ˜ κ²ƒμ΄λ‹€γ…Ž

 

πŸ“– 풀이

BFSλ₯Ό μ‚¬μš©ν•˜μ—¬ ν’€μ—ˆλ‹€. 제일 μœ„μͺ½ 배열쀑 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ€ 0을 μ°Ύμ•„ BFSλ₯Ό μ‹œμž‘ν•˜μ˜€λ‹€. 그리고 탐색을 마치고 제일 λ§ˆμ§€λ§‰ μ€„μ˜ λ°©λ¬Έμ—¬λΆ€λ₯Ό μ²΄ν¬ν•˜μ—¬ YES λ˜λŠ” NOλ₯Ό 좜λ ₯ν•˜μ˜€λ‹€.

 

πŸ’» μ½”λ“œ

import sys
from collections import deque
input = sys.stdin.readline

n,m = map(int,input().rstrip().split())
ans = "NO"
graph = []
dx = [1,-1,0,0]
dy = [0,0,1,-1]
visited = [[False for i in range(m)] for j in range(n)]
for i in range(n):
    graph.append(list(map(int,input().rstrip())))

# BFS ν•¨μˆ˜ μ •μ˜
def bfs(x,y):
    queue= deque()
    visited[y][x] = True # 방문처리
    queue.append([x,y])
    while queue:
        a,b = queue.popleft()
        for i in range(4):
            nx = a + dx[i]
            ny = b + dy[i]
            if -1 < nx < m and -1 < ny < n:
                if not visited[ny][nx] and graph[ny][nx] == 0: # 아직 λ°©λ¬Έν•˜μ§€ μ•Šκ³  μ›μ†Œκ°€ 0이라면
                    visited[ny][nx] = True
                    queue.append([nx,ny])

for start in range(m):
    if graph[0][start] == 0 and not visited[0][start]: # 첫번째 쀄 μ›μ†Œ 값이 0이라면
        bfs(start,0) # BFS 탐색 μ‹œμž‘

for end in range(m):
    if visited[-1][end]: # λ§ˆμ§€λ§‰ 쀄을 λ°©λ¬Έν•˜μ˜€λ‹€λ©΄
        ans = "YES"
        break
print(ans)

 

πŸ”— 문제링크 : 침투

 

13565번: 침투

첫째 μ€„μ—λŠ” 격자의 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ”  M (2 ≤ M ≤ 1,000) κ³Ό N (2 ≤ N ≤ 1,000) 이 주어진닀. M쀄에 κ±Έμ³μ„œ, N개의 0 λ˜λŠ” 1 이 곡백 없이 주어진닀. 0은 μ „λ₯˜κ°€ 잘 ν†΅ν•˜λŠ” 흰색, 1은 μ „λ₯˜κ°€ ν†΅ν•˜μ§€ μ•Š

www.acmicpc.net