PS

[λ°±μ€€] 3184 μ–‘ with Python

ν˜•μ€€_It's 2021. 10. 19. 22:21
728x90
λ°˜μ‘ν˜•

πŸ“Œ BOJ 3184 μ–‘

πŸ’‘ 쑰건

  1. Rκ³Ό Cκ°€ μ£Όμ–΄μ§€λ©°(3 ≀ R, C ≀ 250), 각 μˆ˜λŠ” λ§ˆλ‹Ήμ˜ ν–‰κ³Ό μ—΄μ˜ 수λ₯Ό μ˜λ―Έν•œλ‹€.
    R개의 쀄은 C개의 κΈ€μžλ₯Ό κ°€μ§„λ‹€. 이듀은 λ§ˆλ‹Ήμ˜ ꡬ쑰(μšΈνƒ€λ¦¬, μ–‘, λŠ‘λŒ€μ˜ μœ„μΉ˜)λ₯Ό μ˜λ―Έν•œλ‹€.

  2. κΈ€μž '.' (점)은 빈 ν•„λ“œλ₯Ό μ˜λ―Έν•˜λ©°, κΈ€μž '#'λŠ” μšΈνƒ€λ¦¬λ₯Ό, 'o'λŠ” μ–‘, 'v'λŠ” λŠ‘λŒ€λ₯Ό μ˜λ―Έν•œλ‹€.

  3. ν•œ μΉΈμ—μ„œ μˆ˜ν‰, 수직만으둜 μ΄λ™ν• μˆ˜ μžˆλ‹€.
    μ˜μ—­ μ•ˆμ˜ μ–‘μ˜ μˆ˜κ°€ λŠ‘λŒ€μ˜ μˆ˜λ³΄λ‹€ λ§Žλ‹€λ©΄ 이기고, λŠ‘λŒ€κ°€ 많으면 양은 사라진닀.

  4. 넓이 μš°μ„  탐색(BFS) μ•Œκ³ λ¦¬μ¦˜ μœ ν˜•μ˜ 문제

πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

from sys import stdin
from collections import deque

n, m = map(int, stdin.readline().split())
board = []
for n in range(n):
    board.append(list(stdin.readline().rstrip()))
dx, dy = [1, -1, 0, 0], [0, 0, -1, 1]
visited = set()


def bfs(x, y):
    vo = [set(), set()]
    q = deque()
    q.append((x, y))
    visited.add((x, y))
    while q:
        x, y = q.popleft()

        if board[x][y] == 'o':
            vo[1].add((x, y))
        elif board[x][y] == 'v':
            vo[0].add((x, y))

        for i in range(4):
            nx, ny = dx[i] + x, dy[i] + y
            if -1 < nx < n and -1 < ny < m:
                if board[nx][ny] != '#' and (nx, ny) not in visited:
                    q.append((nx, ny))
                    visited.add((nx, ny))

    if len(vo[0]) < len(vo[1]):
        return 0, len(vo[1])
    else:
        return len(vo[0]), 0


answer = [0, 0]
for i in range(n):
    for j in range(m):
        if (board[i][j] == 'v' or board[i][j] == 'o') and (i, j) not in visited:
            v, o = bfs(i, j)

            answer[0] += o
            answer[1] += v

print(*answer)

πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

예제

6 6
...#..
.##v#.
#v.#.#
#.o#.#
.###.#
...###

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

0 2

⌨️ 문제 풀이

  1. μ–‘κ³Ό λŠ‘λŒ€μ˜ 수λ₯Ό 담을 answer 리슀트λ₯Ό 각각의 μ›μ†Œλ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•˜μ—¬ μƒμ„±ν•œλ‹€.
    이미 λ°©λ¬Έν–ˆλ˜ 곳의 μ’Œν‘œλ₯Ό 담을 set μžλ£Œν˜• visitedλ₯Ό μƒμ„±ν•œλ‹€.

  2. 이쀑 반볡문으둜 ν•„λ“œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ, λ‹€μŒ 두가지에 ν•΄λ‹Ήν•˜λ©΄ BFSλ₯Ό μˆ˜ν–‰ν•œλ‹€.

    1. (i, j) κ°€ visited 에 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜μ„ λ•Œ
    2. (i, j) 에 ν•΄λ‹Ήν•˜λŠ” ν•„λ“œ 값이 v ν˜Ήμ€ o 일 λ•Œ
  3. bfs ν•¨μˆ˜μ—μ„œ voλΌλŠ” set()이 λ‘κ°œ λ‹΄κΈ΄ 리슀트λ₯Ό 생성해쀀닀.
    νμ—λŠ” bfs λ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ λ°›μ•„μ˜¨ x, y 값을 λ„£μ–΄μ£Όκ³ , 큐가 빌 λ•ŒκΉŒμ§€ μˆ˜ν–‰ν•œλ‹€.

  4. νμ—μ„œ 뽑아낸 x, y μ’Œν‘œκ°€ ν•„λ“œμ—μ„œ 양인지 λŠ‘λŒ€μΈμ§€ κ΅¬λ¬Έν•˜μ—¬ vo\[1\] ν˜Ήμ€ v\[0\] 에 μ €μž₯ν•΄μ€€λ‹€.
    ν˜„μž¬ μ’Œν‘œμ—μ„œ μƒν•˜μ’Œμš°λ₯Ό μˆœνšŒν•˜λ©° λ°©λ¬Έν•˜μ§€ μ•Šμ•˜κ³ , #이 μ•„λ‹Œ ν•„λ“œμ˜ μ’Œν‘œλ₯Ό 큐와 visited 에 λ„£μ–΄μ€€λ‹€.

  5. 큐가 λΉ„μ–΄ while 반볡문이 μ’…λ£Œλ˜λ©΄, μ–‘μ˜ μˆ˜μ™€ λŠ‘λŒ€μ˜ 수λ₯Ό λΉ„κ΅ν•˜μ—¬
    μˆ˜κ°€ 더 μž‘μ€ μͺ½μ€ 0으둜, 큰 μͺ½μ€ 숫자 κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€.

  6. bfs ν•¨μˆ˜μ—μ„œ λ°˜ν™˜λ°›μ€ 값을 answer μ›μ†Œμ— 각각 더해쀀닀.

πŸ’Ύ λŠλ‚€μ 

  1. BFS λ¬Έμ œμ˜€κ³ , μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ˜€λ‹€.
  2. λ‹€λ₯Έ μ‚¬λžŒμ΄ λ‚΄ 글을 보고 잘 이해할 수 μžˆμ„μ§€λŠ” λͺ¨λ₯΄κ² λ‹€.
  3. 쑰금 더 μ‰½κ²Œ μ„€λͺ…ν•  수 있게 더 높은 μˆ˜μ€€μ˜ 이해가 ν•„μš”ν•  것 κ°™λ‹€.
λ°˜μ‘ν˜•