โ๋ฌธ์
https://www.acmicpc.net/problem/14503
๋ฉ๋ชจ๋ฆฌ: 109544 KB, ์๊ฐ: 92 ms
๋ก๋ด ์ฒญ์๊ธฐ์ ๋ฐฉ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์ฒญ์ํ๋ ์์ญ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ๋ฐฉ์ N×MN×M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, 1×11×1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ ์นธ์ ๋ฒฝ ๋๋ ๋น ์นธ์ด๋ค. ์ฒญ์๊ธฐ๋ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ด ์์ผ๋ฉฐ, ์ด ๋ฐฉํฅ์ ๋, ์, ๋จ, ๋ถ ์ค ํ๋์ด๋ค. ๋ฐฉ์ ๊ฐ ์นธ์ ์ขํ (r,c)(r,c)๋ก ๋ํ๋ผ ์ ์๊ณ , ๊ฐ์ฅ ๋ถ์ชฝ ์ค์ ๊ฐ์ฅ ์์ชฝ ์นธ์ ์ขํ๊ฐ (0,0)(0,0), ๊ฐ์ฅ ๋จ์ชฝ ์ค์ ๊ฐ์ฅ ๋์ชฝ ์นธ์ ์ขํ๊ฐ (N−1,M−1)(N−1,M−1)์ด๋ค. ์ฆ, ์ขํ (r,c)(r,c)๋ ๋ถ์ชฝ์์ (r+1)(r+1)๋ฒ์งธ์ ์๋ ์ค์ ์์ชฝ์์ (c+1)(c+1)๋ฒ์งธ ์นธ์ ๊ฐ๋ฆฌํจ๋ค. ์ฒ์์ ๋น ์นธ์ ์ ๋ถ ์ฒญ์๋์ง ์์ ์ํ์ด๋ค.
๋ก๋ด ์ฒญ์๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ํ๋ค.
- ํ์ฌ ์นธ์ด ์์ง ์ฒญ์๋์ง ์์ ๊ฒฝ์ฐ, ํ์ฌ ์นธ์ ์ฒญ์ํ๋ค.
- ํ์ฌ ์นธ์ ์ฃผ๋ณ 44์นธ ์ค ์ฒญ์๋์ง ์์ ๋น ์นธ์ด ์๋ ๊ฒฝ์ฐ,
- ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์ ์งํ ์ฑ๋ก ํ ์นธ ํ์งํ ์ ์๋ค๋ฉด ํ ์นธ ํ์งํ๊ณ 1๋ฒ์ผ๋ก ๋์๊ฐ๋ค.
- ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ๋ค์ชฝ ์นธ์ด ๋ฒฝ์ด๋ผ ํ์งํ ์ ์๋ค๋ฉด ์๋์ ๋ฉ์ถ๋ค.
- ํ์ฌ ์นธ์ ์ฃผ๋ณ 44์นธ ์ค ์ฒญ์๋์ง ์์ ๋น ์นธ์ด ์๋ ๊ฒฝ์ฐ,
- ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก 90โ90โ ํ์ ํ๋ค.
- ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ์์ชฝ ์นธ์ด ์ฒญ์๋์ง ์์ ๋น ์นธ์ธ ๊ฒฝ์ฐ ํ ์นธ ์ ์งํ๋ค.
- 1๋ฒ์ผ๋ก ๋์๊ฐ๋ค.
โ๐ปํ์ด
[๋ฐฑ์ค] 14503๋ฒ ๋ก๋ด ์ฒญ์๊ธฐ ํ์ด์ฌ ํ์ด
https://www.acmicpc.net/problem/14503 14503๋ฒ: ๋ก๋ด ์ฒญ์๊ธฐ์ฒซ์งธ ์ค์ ๋ฐฉ์ ํฌ๊ธฐ $N$๊ณผ $M$์ด ์ ๋ ฅ๋๋ค. $(3 \le N, M \le 50)$โ ๋์งธ ์ค์ ์ฒ์์ ๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ์นธ์ ์ขํ $(r, c)$์ ์ฒ์์ ๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ๋ฐ
thisismi.tistory.com
์ ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํด์ ํ์์ต๋๋ค.
๐ป์ฝ๋
import sys
input = sys.stdin.readline
N, M = map(int, input().strip().split())
r, c, d = map(int, input().strip().split())
room = [list(map(int, input().strip().split())) for _ in range(N)]
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]
def checked(r, c):
for i in range(4):
nr, nc = r + dr[i], c + dc[i]
if 0 <= nr < N and 0 <= nc < M and room[nr][nc] == 0:
return True
return False
def cleaning(r, c, d):
global room
ans = 0
while True:
if room[r][c] == 0:
ans += 1
room[r][c] = 2
if checked(r, c):
for i in range(1, 5):
dir = (d - i) % 4
nr, nc = r + dr[dir], c + dc[dir]
if 0 <= nr < N and 0 <= nc < M and room[nr][nc] == 0:
d = dir
r, c = nr, nc
break
else:
nr, nc = r - dr[d], c - dc[d]
if 0 > nr or nr >= N or 0 > nc or M <= nc or room[nr][nc] == 1:
return ans
r, c = nr, nc
print(cleaning(r, c, d))
๐ํ๊ธฐ
์ฒ์์๋ DFS๋ก ์ ๊ทผํ๋ค๊ฐ ์๊ฐํด๋ณด๋ ์ด๋ ๊ฒ ํ๋ฉด 1๋ฒ์ผ๋ก ๋ค์ ๋์๊ฐ์ง ์์์ while๋ฌธ์ผ๋ก ๊ทธ๋ฅ ๊ตฌํํ๋ฉด ๋๋ ๊ฑธ ๋ค๋ฆ๊ฒ ์๊ฐํ๋ค...
'Coding Test > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 14499. ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ/Python - Gold4 (4) | 2025.08.02 |
---|---|
[๋ฐฑ์ค] 3190. ๋ฑ/Python - Gold4 (3) | 2025.07.30 |
[๋ฐฑ์ค] 14891. ํฑ๋๋ฐํด/Python - Gold5 (2) | 2025.07.25 |
[๋ฐฑ์ค] 14501. ํด์ฌ/Python - Silver3 (1) | 2025.07.23 |
[SWEA] 2819. ๊ฒฉ์ํ์ ์ซ์ ์ด์ด๋ถ์ด๊ธฐ/Python - D4 (0) | 2025.07.22 |