🧩 Problem Solving/[λ°±μ€€]

[λ°±μ€€] 21736 ν—Œλ‚΄κΈ°λŠ” μΉœκ΅¬κ°€ ν•„μš”ν•΄ (python 파이썬)

μ œλ΄‰μ•„ 2023. 11. 19. 16:08
 

21736번: ν—Œλ‚΄κΈ°λŠ” μΉœκ΅¬κ°€ ν•„μš”ν•΄

2020년에 μž…ν•™ν•œ ν—Œλ‚΄κΈ° 도연이가 μžˆλ‹€. λ„μ—°μ΄λŠ” λΉ„λŒ€λ©΄ μˆ˜μ—… λ•Œλ¬Έμ— 학ꡐ에 κ°€μ§€ λͺ»ν•΄ 학ꡐ에 μ•„λŠ” μΉœκ΅¬κ°€ μ—†μ—ˆλ‹€. λ“œλ””μ–΄ λŒ€λ©΄ μˆ˜μ—…μ„ ν•˜κ²Œ 된 λ„μ—°μ΄λŠ” μ–΄μ„œ 캠퍼슀 λ‚΄μ˜ μ‚¬λžŒλ“€κ³Ό μΉœν•΄μ§€κ³ 

www.acmicpc.net


ν‰λ²”ν•œ κ·Έλž˜ν”„ 탐색 문제. 


아이디어

bfs λ˜λŠ” dfsλ₯Ό ν™œμš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜λ©΄ λœλ‹€. 

 

1. κ·Έλž˜ν”„ μ‹œμž‘μ§€μ—­ 'I'λŠ” 캠퍼슀 정보λ₯Ό λ°›μ•„μ˜¬ λ•Œ 미리 μ°Ύμ•„λ‘˜ 수 μžˆλ‹€.

2. λΉˆκ³΅κ°„ λΏμ•„λ‹ˆλΌ μ‚¬λžŒμ΄ μžˆλŠ” 지역 'P'도 이동 κ°€λŠ₯ν•˜λ‹€. 

3. 정닡을 좜λ ₯ν•  λ•Œ, 닡이 0λͺ…이면 0이 μ•„λ‹Œ "TT"λ₯Ό 좜λ ₯ν•΄ 주자.


전체 μ½”λ“œ

from collections import deque

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
campus = [] # 캠퍼슀 정보λ₯Ό λ‹΄λŠ” 리슀트
ix, iy = 0, 0 # 졜초 μ‹œμž‘ μœ„μΉ˜μ˜ μ’Œν‘œ ix, iy
answer = 0 # λ§Œλ‚  수 μžˆλŠ” μ‚¬λžŒμ˜ 수, 좜λ ₯κ°’

N, M = map(int, input().split()) # 캠퍼슀 크기 μž…λ ₯

for i in range(N):
    campus.append(list(input()))
    for j in range(M):
        if campus[i][j] == 'I': # μ‹œμž‘ μœ„μΉ˜ μ°ΎκΈ°
            ix, iy = i, j

visited = [[0] * M for _ in range(N)] # λ°©λ¬Έ 정보λ₯Ό λ‹΄λŠ” 리슀트

deq = deque()
deq.append([ix, iy]) # 졜초 μ‹œμž‘ μœ„μΉ˜ insert

while deq: # 큐가 빌 λ•ŒκΉŒμ§€
    x, y = deq.popleft()
    for i in range(4):  # μƒν•˜μ’Œμš° 탐색
        nx, ny = x + dx[i], y + dy[i]
        if 0 <= nx < N and 0 <= ny < M and visited[nx][ny] == 0: # λ°©λ¬Έ μ•ˆν–ˆμœΌλ©΄ 
            visited[nx][ny] = 1 # λ°©λ¬Έ ν‘œμ‹œ
            if campus[nx][ny] == 'O':  # 빈 곡간 이면 
                deq.append([nx, ny])
            elif campus[nx][ny] == 'P':  # μ‚¬λžŒ 이면
                deq.append([nx, ny])
                answer += 1 # λ§Œλ‚œ μ‚¬λžŒ 수 증가

print('TT' if answer == 0 else answer) # μ •λ‹΅ 좜λ ₯

μ½”λ“œ μ„€λͺ…

for i in range(N):
    campus.append(list(input()))
    for j in range(M):
        if campus[i][j] == 'I': # μ‹œμž‘ μœ„μΉ˜ μ°ΎκΈ°
            ix, iy = i, j

 

캠퍼슀 정보λ₯Ό μž…λ ₯λ°›μœΌλ©΄μ„œ μ‹œμž‘ μœ„μΉ˜λ₯Ό 미리 μ°Ύμ•˜λ‹€.

 

 

deq = deque()
deq.append([ix, iy]) # 졜초 μ‹œμž‘ μœ„μΉ˜ insert

while deq: # 큐가 빌 λ•ŒκΉŒμ§€
    x, y = deq.popleft()
    for i in range(4):  # μƒν•˜μ’Œμš° 탐색
        nx, ny = x + dx[i], y + dy[i]
        if 0 <= nx < N and 0 <= ny < M and visited[nx][ny] == 0: # λ°©λ¬Έ μ•ˆν–ˆμœΌλ©΄ 
            visited[nx][ny] = 1 # λ°©λ¬Έ ν‘œμ‹œ
            if campus[nx][ny] == 'O':  # 빈 곡간 이면 
                deq.append([nx, ny])
            elif campus[nx][ny] == 'P':  # μ‚¬λžŒ 이면
                deq.append([nx, ny])
                answer += 1 # λ§Œλ‚œ μ‚¬λžŒ 수 증가

졜초 μ‹œμž‘ μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ bfs탐색을 ν–ˆλ‹€. 캠퍼슀 크기와 문제 쑰건에 맞게 if문을 μž‘μ„±ν•΄ μ€€λ‹€.