๐Ÿ—๏ธ Algorithm/๐ŸŸฉ ๋ฐฑ์ค€

๐ŸŸฉ [๋ฐฑ์ค€] [Python] 3184๋ฒˆ_์–‘

Dbswnstjd 2022. 12. 7. 04:21

๋ฌธ์ œ

https://www.acmicpc.net/problem/3184

 

3184๋ฒˆ: ์–‘

์ฒซ ์ค„์—๋Š” ๋‘ ์ •์ˆ˜ R๊ณผ C๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ(3 ≤ R, C ≤ 250), ๊ฐ ์ˆ˜๋Š” ๋งˆ๋‹น์˜ ํ–‰๊ณผ ์—ด์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋‹ค์Œ R๊ฐœ์˜ ์ค„์€ C๊ฐœ์˜ ๊ธ€์ž๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด๋“ค์€ ๋งˆ๋‹น์˜ ๊ตฌ์กฐ(์šธํƒ€๋ฆฌ, ์–‘, ๋Š‘๋Œ€์˜ ์œ„์น˜)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

www.acmicpc.net

ํ’€์ด

# ๋ฐฑ์ค€ 3184๋ฒˆ ๋ฌธ์ œ - ์–‘
from collections import deque
r, c = map(int, input().split())
graph = [list(map(str, input())) for _ in range(r)]
dx, dy = [0,0,-1,1], [1,-1,0,0]
def bfs(x, y):
    q = deque()
    q.append((x, y))
    visited[x][y] = 1
    global count_sheep, count_wolf

    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or nx >= r or ny < 0 or ny >= c: # ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜ ํƒˆ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
                count_wolf = -1
                count_sheep = -1
                break
            elif 0 <= nx < r and 0 <= ny < c and not visited[nx][ny]:
                if graph[nx][ny] == '#':
                    visited[nx][ny] = 1
                    continue
                elif graph[nx][ny] == '.':
                    visited[nx][ny] = 1
                    q.append((nx, ny))
                elif graph[nx][ny] == 'o':
                    count_sheep += 1
                    visited[nx][ny] = 1
                    q.append((nx, ny))
                else:
                    count_wolf += 1
                    visited[nx][ny] = 1
                    q.append((nx, ny))
    
    return count_sheep, count_wolf

visited = [[0]*c for _ in range(r)]
res = [0,0]
for i in range(r):
    for j in range(c):
        if graph[i][j] == 'v' and not visited[i][j]: # ๋Š‘๋Œ€๊ฐ€ ์‚ฌ๋ƒฅ์„ ์‹œ์ž‘
            count_sheep = 0
            count_wolf = 1 # ๋Š‘๋Œ€ ํ•œ๋งˆ๋ฆฌ๋กœ ์‹œ์ž‘
            cnt = bfs(i, j)
            if cnt[1] == -1: # ๋Š‘๋Œ€ ํ˜ผ์ž ์žˆ๋Š” ๊ฒฝ์šฐ 
                continue
            if cnt[0] > cnt[1]: # ์–‘์ด ๋Š‘๋Œ€๋ณด๋‹ค ๋งŽ์€ ๊ฒฝ์šฐ
                res[0] += cnt[0]
            else: # ๋Š‘๋Œ€๊ฐ€ ์–‘๋ณด๋‹ค ๋งŽ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ
                res[1] += cnt[1]
        elif graph[i][j] == 'o' and not visited[i][j]: # ์–‘์ด ์‚ฌ๋ƒฅ ์‹œ์ž‘
            count_sheep = 1 # ์–‘ ํ•œ๋งˆ๋ฆฌ๋กœ ์‹œ์ž‘
            count_wolf = 0
            cnt = bfs(i, j)
            if cnt[0] == -1: # ์–‘ ํ˜ผ์ž ์žˆ๋Š” ๊ฒฝ์šฐ
                continue
            if cnt[0] > cnt[1]: # ์–‘์ด ๋Š‘๋Œ€๋ณด๋‹ค ๋งŽ์€ ๊ฒฝ์šฐ
                res[0] += cnt[0]
            else: # ๋Š‘๋Œ€๊ฐ€ ์–‘๋ณด๋‹ค ๋งŽ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ
                res[1] += cnt[1]
for i in res:
    print(i, end=' ')

์ด๋ฒˆ ๋ฌธ์ œ๋Š” BFS๋ฅผ ํ†ตํ•ด ํ’€์—ˆ๋‹ค. 

์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ๊ทธ๋ ‡๊ฒŒ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด๊ฑฐ ๊ฐ™์ง€ ์•Š์•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์ฝ์ง€ ์•Š์•„์„œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ ๋ฌธ์ œ์˜€๋‹ค. 

์ผ๋‹จ ์กฐ๊ฑด์—์„œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋˜๋ฉด ๊ทธ๊ฒƒ์€ ์–ด๋–ค ์˜์—ญ์—๋„ ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜์˜€๋Š”๋ฐ ์ด ์กฐ๊ฑด์„ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•ด์„œ ์ž๊พธ ํ‹€๋ ธ๋‹ค๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค. (ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ๋Š” ์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ผ€์ด์Šค๊ฐ€ ์—†์Œ)

๊ทธ๋ž˜์„œ ๋Š‘๋Œ€๊ฐ€ ์‚ฌ๋ƒฅ์„ ์‹œ์ž‘ํ• ๋•Œ์™€ ์–‘์ด ์‚ฌ๋ƒฅ์„ ์‹œ์ž‘ํ• ๋•Œ๋กœ ๋‚˜๋ˆ„์–ด ์ผ€์ด์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜์˜€๋‹ค. 

 

 #(์šธํƒ€๋ฆฌ)๋ฅผ ๋งŒ๋‚˜๋ฉด ์ง€๋‚˜๊ฐ€์ง€ ๋ชปํ•˜๋ฏ€๋กœ continue

.์„ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ q์— ์‚ฝ์ž…ํ•ด์ฃผ๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ํ›„ ๋„˜์–ด๊ฐ„๋‹ค. 

๊ทธ๋ฆฌ๊ณ  o๋Š” ์–‘์„ ์„ธ์ฃผ๋Š” ๋ณ€์ˆ˜๋ฅผ 1์ฆ๊ฐ€, v๋Š” ๋Š‘๋Œ€๋ฅผ ์„ธ์ฃผ๋Š” ๋ณ€์ˆ˜๋ฅผ 1์ฆ๊ฐ€ ํ•˜์—ฌ ๋‹ต์„ ๊ตฌํ•˜์˜€๋‹ค. 

BFS๊ฐ€ ๋๋‚˜๊ฒŒ ๋˜๋ฉด ์–‘๊ณผ ๋Š‘๋Œ€์˜ ๋งˆ๋ฆฌ์ˆ˜๋ฅผ ๋น„๊ต ํ›„ ๋” ํฐ ๊ฐ’์„ res์— ์ €์žฅํ•œ๋‹ค.