๐Ÿ“š Study/Baekjoon

[Gold V] 14503 - ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

์œฐ๊ฐฑ 2025. 4. 13. 03:45

๋ฌธ์ œ

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ์™€ ๋ฐฉ์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฒญ์†Œํ•˜๋Š” ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ๋ฐฉ์€ $ ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ,  ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นธ์€ ๋ฒฝ ๋˜๋Š” ๋นˆ ์นธ์ด๋‹ค. ์ฒญ์†Œ๊ธฐ๋Š” ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์ด ์žˆ์œผ๋ฉฐ, ์ด ๋ฐฉํ–ฅ์€ ๋™, ์„œ, ๋‚จ, ๋ถ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋ฐฉ์˜ ๊ฐ ์นธ์€ ์ขŒํ‘œ ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , ๊ฐ€์žฅ ๋ถ์ชฝ ์ค„์˜ ๊ฐ€์žฅ ์„œ์ชฝ ์นธ์˜ ์ขŒํ‘œ๊ฐ€ , ๊ฐ€์žฅ ๋‚จ์ชฝ ์ค„์˜ ๊ฐ€์žฅ ๋™์ชฝ ์นธ์˜ ์ขŒํ‘œ๊ฐ€ ์ด๋‹ค. ์ฆ‰, ์ขŒํ‘œ ๋Š” ๋ถ์ชฝ์—์„œ ๋ฒˆ์งธ์— ์žˆ๋Š” ์ค„์˜ ์„œ์ชฝ์—์„œ ๋ฒˆ์งธ ์นธ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ฒ˜์Œ์— ๋นˆ ์นธ์€ ์ „๋ถ€ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋‹ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.

  1. ํ˜„์žฌ ์นธ์ด ์•„์ง ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํ˜„์žฌ ์นธ์„ ์ฒญ์†Œํ•œ๋‹ค.
  2. ํ˜„์žฌ ์นธ์˜ ์ฃผ๋ณ€ ์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์—†๋Š” ๊ฒฝ์šฐ,
    1. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ํ•œ ์นธ ํ›„์ง„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•œ ์นธ ํ›„์ง„ํ•˜๊ณ  1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
    2. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์˜ ๋’ค์ชฝ ์นธ์ด ๋ฒฝ์ด๋ผ ํ›„์ง„ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ž‘๋™์„ ๋ฉˆ์ถ˜๋‹ค.
  3. ํ˜„์žฌ ์นธ์˜ ์ฃผ๋ณ€ ์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ,
    1. ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ  ํšŒ์ „ํ•œ๋‹ค.
    2. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์•ž์ชฝ ์นธ์ด ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ธ ๊ฒฝ์šฐ ํ•œ ์นธ ์ „์ง„ํ•œ๋‹ค.
    3. 1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฐฉ์˜ ํฌ๊ธฐ ๊ณผ ์ด ์ž…๋ ฅ๋œ๋‹ค. (3≤N,M≤50)โ€Š ๋‘˜์งธ ์ค„์— ์ฒ˜์Œ์— ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ขŒํ‘œ ์™€ ์ฒ˜์Œ์— ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ ๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. ๊ฐ€ $์ธ ๊ฒฝ์šฐ ๋ถ์ชฝ, ์ธ ๊ฒฝ์šฐ ๋™์ชฝ, ์ธ ๊ฒฝ์šฐ ๋‚จ์ชฝ, ์ธ ๊ฒฝ์šฐ ์„œ์ชฝ์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์…‹์งธ ์ค„๋ถ€ํ„ฐ ๊ฐœ์˜ ์ค„์— ๊ฐ ์žฅ์†Œ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐœ์˜ ๊ฐ’์ด ํ•œ ์ค„์— ๊ฐœ์”ฉ ์ž…๋ ฅ๋œ๋‹ค. ๋ฒˆ์งธ ์ค„์˜ ๋ฒˆ์งธ ๊ฐ’์€ ์นธ ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด ๊ฐ’์ด ์ธ ๊ฒฝ์šฐ ๊ฐ€ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด๊ณ , ์ธ ๊ฒฝ์šฐ ์— ๋ฒฝ์ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐฉ์˜ ๊ฐ€์žฅ ๋ถ์ชฝ, ๊ฐ€์žฅ ๋‚จ์ชฝ, ๊ฐ€์žฅ ์„œ์ชฝ, ๊ฐ€์žฅ ๋™์ชฝ ์ค„ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์— ์œ„์น˜ํ•œ ๋ชจ๋“  ์นธ์—๋Š” ๋ฒฝ์ด ์žˆ๋‹ค. ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ํ•ญ์ƒ ๋นˆ ์นธ์ด๋‹ค.

์ถœ๋ ฅ

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์ž‘๋™์„ ์‹œ์ž‘ํ•œ ํ›„ ์ž‘๋™์„ ๋ฉˆ์ถœ ๋•Œ๊นŒ์ง€ ์ฒญ์†Œํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1 ๋ณต์‚ฌ

3 3
1 1 0
1 1 1
1 0 1
1 1 1

์˜ˆ์ œ ์ถœ๋ ฅ 1 ๋ณต์‚ฌ

1

์˜ˆ์ œ ์ž…๋ ฅ 2 ๋ณต์‚ฌ

11 10
7 4 0
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 1 1 1 1 0 1
1 0 0 1 1 0 0 0 0 1
1 0 1 1 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 1 1 0 1
1 0 0 0 0 0 1 1 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1

์˜ˆ์ œ ์ถœ๋ ฅ 2 ๋ณต์‚ฌ

57

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

์žฌ๊ท€์  ํŠน์ง•์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— dfs๋กœ ์ ‘๊ทผํ–ˆ๋‹ค.

์ฃผ๋ณ€ ์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์™€ ์—†๋Š” ๊ฒฝ์šฐ ๊ฐ๊ฐ์˜ ์ฝ”๋“œ๋Š” ๊ตฌํ˜„์ด ์–ด๋ ต์ง€ ์•Š์•˜๋Š”๋ฐ

์ด๊ฑธ ๋ฌถ๋Š” ๊ณผ์ •์—์„œ ์ข€ ํ—ค๋งธ๋˜๊ฑฐ ๊ฐ™๋‹ค.


# ์ฝ”๋“œ

# 2025-04-13 03:20-40
import sys
sys.stdin = open("input.txt","r")
n, m = map(int,sys.stdin.readline().split())
r,c,d = map(int,sys.stdin.readline().split())
graph = [list(map(int,sys.stdin.readline().split())) for _ in range(n)]

# ๋ถ ๋™ ๋‚จ ์„œ
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# 0: ์ฒญ์†Œ x / 1: ๋ฒฝ / 2: ์ฒญ์†Œ o
def dfs(x,y,d):
    global cnt

    if graph[x][y] == 0:
        graph[x][y] = 2
        cnt += 1
    
    for _ in range(4):
        d = (d + 3) % 4 # ๋ฐ˜์‹œ๊ณ„ 90๋„ ํšŒ์ „
        nx, ny = x + dx[d], y + dy[d]
        if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 0:
            dfs(nx, ny, d)
            return
    
    # ์ฃผ๋ณ€ 4์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ์นธ์ด ์—†๋Š” ๊ฒฝ์šฐ
    bx, by = x - dx[d], y - dy[d] # ํ•œ ์นธ ํ›„์ง„
    if 0 <= bx < n and 0 <= by < m and graph[bx][by] != 1:
        dfs(bx, by, d)

cnt = 0
dfs(r,c,d)
print(cnt)

# ์ฐธ๊ณ 

์ฒซ ์‹œ๋„ํ–ˆ์„ ๋•Œ

๋ฒฝ๊ณผ ์ฒญ์†Œo๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ 

๋ถˆํ•„์š”ํ•œ all_cleanํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํƒ“์— ์‹คํŒจํ–ˆ์Œ

#  2025-04-12 16:05-17:00
import sys
# sys.stdin = open("input.txt","r")
sys.setrecursionlimit(10**6)

n, m = map(int,sys.stdin.readline().split())
r, c, d = map(int,sys.stdin.readline().split())
graph = [list(map(int,sys.stdin.readline().split())) for _ in range(n)]

# ์œ„ ์˜ค ์•„๋ž˜ ์™ผ
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def all_clean(x,y):
    for i in range(4):
        nx, ny = x + dx[i], y + dy[i]
        if 0 <= nx < n and 0 <= ny < m:
            if graph[nx][ny] == 0:
                return False
    return True


def dfs(x,y,d):
    global cnt
    if graph[x][y] == 0: # ํ˜„์žฌ ์นธ์ด ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
        cnt += 1
        graph[x][y] = 1 # ์ฒญ์†Œํ•˜๊ธฐ
    
    # ํ˜„์žฌ ์นธ์˜ ์ฃผ๋ณ€  4์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์—†๋Š” ๊ฒฝ์šฐ
    if all_clean(x,y):
        nx, ny = x - dx[d], y - dy[d]
        if nx <= -1 or nx >= n or ny <= -1 or ny >= m:
            return
        dfs(nx,ny,d)
    
    # ํ˜„์žฌ ์นธ์˜ ์ฃผ๋ณ€  4์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
    else:
        d = (d - 1) % 4

        nx, ny = x + dx[d], y + dy[d]
        if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 0:
            dfs(nx,ny,d)
        else:
            dfs(x,y,d)

cnt = 0
dfs(r,c,d)
print(cnt)