๐Ÿงฉ Algorithm/[BOJ] Silver

[BOJ] 1303. ์ „์Ÿ - ์ „ํˆฌ (Python/๊ทธ๋ž˜ํ”„ํƒ์ƒ‰/Silver 1)

devCloud 2024. 11. 16. 17:55
728x90

[๋ฌธ์ œ ๋งํฌ] ๐Ÿ‘‰ https://www.acmicpc.net/problem/1303


ํ’€์ด ๋ฐฉ๋ฒ•

๐Ÿ’ก DFS, BFS ์ด์šฉ

 

๐Ÿ“Œ ์ฃผ์˜ํ•  ์ 

  • ๊ฐ€๋กœ, ์„ธ๋กœ ํ™•์ธํ•˜๊ฐ€

Solution

from collections import deque

dx = [1, 0, -1, 0]
dy = [0, -1, 0, 1]

N, M = map(int, input().split())
war = [input().strip() for _ in range(M)]
visited = [[0] * N for _ in range(M)]
W, B = 0, 0

def dfs(i, j, color):
    cnt = 1
    visited[i][j] = 1
    queue = deque()
    queue.append((i, j))
    while queue:
        x, y = queue.popleft()

        for k in range(4):
            nx = dx[k] + x
            ny = dy[k] + y
            if 0 <= nx < M and 0 <= ny < N:
                if visited[nx][ny] == 0 and war[nx][ny] == color:
                    visited[nx][ny] = 1
                    cnt += 1
                    queue.append([nx, ny])
    return cnt

for i in range(M):  # ์„ธ๋กœ
    for j in range(N):  # ๊ฐ€๋กœ
        if war[i][j] == "W" and visited[i][j] == 0:
            W += dfs(i, j, "W") ** 2
        elif war[i][j] == "B" and visited[i][j] == 0:
            B += dfs(i, j, "B") ** 2

print(W, B)

 

๊ฐœ์„ ํ•  ์ 

  • dfs ํ•จ์ˆ˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ
    • ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์‹ค์ œ ์‚ฌ์šฉ ๋ฐฉ์‹์ธ BFS๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, bfs๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ์ ˆํ•˜๋‹ค.
  • deque.append์—์„œ ํŠœํ”Œ ์‚ฌ์šฉ
    • queue.append([nx, ny]) ๋Œ€์‹  queue.append((nx, ny))๋กœ ํ†ต์ผ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํŠœํ”Œ์€ ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅ(immutable)ํ•˜๋ฏ€๋กœ, BFS/DFS์—์„œ ์ขŒํ‘œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋ถˆํ•„์š”ํ•œ ์กฐ๊ฑด ๊ฐ„์†Œํ™”
    • if war[i][j] == "W" and visited[i][j] == 0 ๋Œ€์‹  if not visited[i][j]๋กœ ์‹œ์ž‘ํ•˜๊ณ , war[i][j]๋ฅผ ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ ๋ฐ˜๋ณต๋˜๋Š” ์กฐ๊ฑด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • dx, dy ์ •์˜ ๊ฐ„์†Œํ™”
    • dx์™€ dy๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜๋ˆ„๊ธฐ๋ณด๋‹ค, ์ด๋™ ๋ฐฉํ–ฅ์„ (x, y) ํ˜•ํƒœ๋กœ ๋ฌถ์œผ๋ฉด ๋” ๊ฐ„๊ฒฐํ•˜๋‹ค.
  • ์ž…๋ ฅ ์ฒ˜๋ฆฌ ์ตœ์ ํ™”
    • ์ž…๋ ฅ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ๋•Œ strip()์€ ๋ถˆํ•„์š”ํ•˜๋‹ค. input()์œผ๋กœ ํ•œ ์ค„์”ฉ ์ฝ๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๋ฐฑ์ด ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

๊ฐœ์„ ๋œ ์ฝ”๋“œ

from collections import deque

directions = [(1, 0), (0, -1), (-1, 0), (0, 1)]

N, M = map(int, input().split())
war = [input() for _ in range(M)]
visited = [[0] * N for _ in range(M)]
W, B = 0, 0

def bfs(i, j, color):
    cnt = 1
    queue = deque([(i, j)])
    visited[i][j] = 1

    while queue:
        x, y = queue.popleft()
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if 0 <= nx < M and 0 <= ny < N and not visited[nx][ny] and war[nx][ny] == color:
                visited[nx][ny] = 1
                cnt += 1
                queue.append((nx, ny))
    return cnt

for i in range(M):
    for j in range(N):
        if not visited[i][j]:
            power = bfs(i, j, war[i][j])
            if war[i][j] == "W":
                W += power ** 2
            else:
                B += power ** 2

print(W, B)

๐Ÿ‘ฉ‍๐Ÿ’ป ํšŒ๊ณ 

๊ฐ€๋กœ, ์„ธ๋กœ ๋•Œ๋ฌธ์— IndexError๋ฅผ ๊ฒช์—ˆ๋‹ค.. ๊ธ€์„ ์ž˜ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.


 

728x90