๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

ํ—Œ๋‚ด๊ธฐ๋Š” ์นœ๊ตฌ๊ฐ€ ํ•„์š”ํ•ด (๋ฐฑ์ค€ 21736)

by ์ฝ”ํ—ค0121 2026. 2. 25.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ ๋ฌธ์ œ ํ•ต์‹ฌ ์š”์•ฝ

  • ์ƒํ™ฉ: $N \times M$ ์บ ํผ์Šค์—์„œ '๋„์—ฐ(I)'์ด๊ฐ€ '์‚ฌ๋žŒ(P)'์„ ๋ช‡ ๋ช… ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๊ธฐ.
  • ์ œ์•ฝ: ๋ฒฝ(X)์€ ๋ชป ์ง€๋‚˜๊ฐ€๊ณ , ๋นˆ ๊ณต๊ฐ„(O)๋งŒ ์ด๋™ ๊ฐ€๋Šฅ.
  • ๊ฒฐ๊ณผ: ๋งŒ๋‚œ ์‚ฌ๋žŒ์ด 0๋ช…์ด๋ฉด "TT" ์ถœ๋ ฅ.
  • ๋ณธ์งˆ: ์‹œ์ž‘์ (I)์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
    • DFS๋กœ๋„ ํ’€์ˆ˜ ์žˆ์–ด์š” !

๐Ÿง  ์™œ ๋‚ด ์ฝ”๋“œ๋Š” ํ„ฐ์กŒ์„๊นŒ? (๋ณต๊ธฐ)

์ฒ˜์Œ์— ํ”ํžˆ ํ•˜๋Š” ์‹ค์ˆ˜ 4๊ฐ€์ง€๋ฅผ ๋ชจ์•„๋ดค์Šต๋‹ˆ๋‹ค. (์ œ๊ฐ€ ๋‹ค ํ•ด๋ณธ ๊ฒƒ๋“ค์ด์—์š”...)

  1. ์กฐ๊ฑด๋ฌธ ์šฐ์„ ์ˆœ์œ„ ๋Œ€์ฐธ์‚ฌ if 0 <= nx < m and 0 <= ny < n or people[nx][ny] == "P":
    ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด and๊ฐ€ ๋จผ์ € ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฒ”์œ„ ๋ฐ–์ด์–ด๋„ ๋’ท๋ถ€๋ถ„์˜ people ๋ฐฐ์—ด์„ ํ™•์ธํ•˜๋ ค๋‹ค ๋ฐ”๋กœ IndexError๊ฐ€ ํ„ฐ์ง‘๋‹ˆ๋‹ค.
  2. ๋ฌดํ•œ ๋ฃจํ”„์˜ ๋Šช ๋ฐฉ๋ฌธ ์ฒดํฌ(visited) ๋ฐฐ์—ด์ด ์—†์œผ๋ฉด ๋„์—ฐ์ด๋Š” ๊ฐ”๋˜ ๊ธธ์„ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•ด์„œ ๋•๋‹ˆ๋‹ค. BFS์—์„œ ๋ฐฉ๋ฌธ ๋ฐฐ์—ด์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜!
  3. ์ธ๋ฑ์Šค ํ˜ผ๋™ (x, y) ๋ณดํ†ต people[ํ–‰][์—ด] ์ˆœ์„œ์ด๋ฏ€๋กœ people[y][x]๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๊ฑธ ๊ฑฐ๊พธ๋กœ ์“ฐ๋ฉด ๋…ผ๋ฆฌ๊ฐ€ ๊ผฌ์ž…๋‹ˆ๋‹ค.
  4. ๋ฃจํ”„ ์•ˆ์˜ `print()๋””๋ฒ„๊น…์šฉ์œผ๋กœ ๋„ฃ์€print` ํ•˜๋‚˜๊ฐ€ ๋ฐฑ์ค€์—์„œ๋Š” '์‹œ๊ฐ„ ์ดˆ๊ณผ'๋ฅผ ๋ถ€๋ฅด๋Š” ์ž์‚ด ๋ฒ„ํŠผ์ด ๋ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ์€ ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ!

๐Ÿš€ ์ตœ์ข… ์ •๋‹ต ์ฝ”๋“œ (Python)

import sys
from collections import deque

input = sys.stdin.readline

# 1. ๋ฐฉํ–ฅ ์„ค์ • (์ƒํ•˜์ขŒ์šฐ)
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

n, m = map(int, input().split())

# 2. ์ง€๋„ ๋ฐ ๋ฐฉ๋ฌธ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
campus = [input().strip() for _ in range(n)]
visited = [[False] * m for _ in range(n)]
dq = deque()

# 3. ๋„์—ฐ์ด(I) ์œ„์น˜ ์ฐพ๊ธฐ
start_found = False
for i in range(n):
    for j in range(m):
        if campus[i][j] == "I":
            dq.append((i, j))
            visited[i][j] = True
            start_found = True
            break
    if start_found: break

count = 0

# 4. BFS ์‹œ์ž‘
while dq:
    y, x = dq.popleft()

    for i in range(4):
        ny, nx = y + dy[i], x + dx[i]

        # ๋ฒ”์œ„ ๋‚ด์— ์žˆ๊ณ , ๋ฐฉ๋ฌธํ•œ ์  ์—†์œผ๋ฉฐ, ๋ฒฝ์ด ์•„๋‹ ๋•Œ๋งŒ ์ด๋™
        if 0 <= ny < n and 0 <= nx < m:
            if not visited[ny][nx] and campus[ny][nx] != "X":
                visited[ny][nx] = True
                if campus[ny][nx] == "P":
                    count += 1
                dq.append((ny, nx))

# 5. ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print(count if count > 0 else "TT")

๐Ÿ’ก ์ •๋ฆฌํ•˜๋ฉฐ

์ด ๋ฌธ์ œ๋Š” ์‚ฌ์‹ค "BFS์˜ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ •ํ™•ํ•˜๊ฒŒ ์ง€ํ‚ค๋А๋ƒ"๋ฅผ ๋ฌป๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  • ๋ฒ”์œ„ ์ฒดํฌ๋Š” ๊ฐ€์žฅ ๋จผ์ €!
  • ๋ฐฉ๋ฌธ ๋ฐฐ์—ด๋กœ ์ค‘๋ณต ์ œ๊ฑฐ!
  • ์กฐ๊ฑด ์ˆœ์„œ (๋ฒ”์œ„ ํ™•์ธ ํ›„ ๋ฐฐ์—ด ์ ‘๊ทผ) ์ง€ํ‚ค๊ธฐ!

๊ฒฉ์ž ํƒ์ƒ‰ ๋ฌธ์ œ์—์„œ ์ž๊พธ ํ‹€๋ฆฐ๋‹ค๋ฉด, ์œ„ 3๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋†“์น˜๊ณ  ์žˆ์„ ํ™•๋ฅ ์ด 90%์ž…๋‹ˆ๋‹ค. ์‹ค๋ฒ„ 2 ์ˆ˜์ค€์—์„œ BFS๋ฅผ ์™„๋ฒฝํžˆ ๋‹ค์ง€๊ณ  ์‹ถ์€ ๋ถ„๋“ค๊ป˜ ๊ฐ•์ถ”ํ•˜๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค!


728x90
๋ฐ˜์‘ํ˜•