๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[BAEKJOON python] 21611_๋ง๋ฒ์ฌ ์์ด์ ๋ธ๋ฆฌ์๋ ๋ณธ๋ฌธ
๐ฆฅ ์ฝํ
/BAEKJOON
[BAEKJOON python] 21611_๋ง๋ฒ์ฌ ์์ด์ ๋ธ๋ฆฌ์๋
์ง์ง์ํ์นด 2023. 4. 7. 23:15728x90
๋ฐ์ํ
๋ง๋ฒ์ฌ ์์ด์ ๋ธ๋ฆฌ์๋
ํฌ๊ธฐ๊ฐ N×N์ธ ๊ฒฉ์์์ ์ฐ์ต
N์ ํญ์ ํ์์ด๊ณ , (r, c)๋ ๊ฒฉ์์ rํ c์ด
๊ฒฉ์์ ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์ (1, 1)์ด๊ณ , ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ซ ์นธ์ (N, N)
๋ง๋ฒ์ฌ ์์ด๋ ((N+1)/2, (N+1)/2)
์ผ๋ถ ์นธ๊ณผ ์นธ ์ฌ์ด์๋ ๋ฒฝ์ด ์ธ์์ ธ ์์ผ๋ฉฐ, ์ค์ ์ ๋ฒฝ, ์ ์ ์ ๋ฒฝ์ด ์๋
์นธ์ ์ ํ์๋ ์๋ ์นธ์ ๋ฒํธ
๊ฐ์ฅ ์ฒ์์ ์์ด๊ฐ ์๋ ์นธ์ ์ ์ธํ ๋๋จธ์ง ์นธ์๋ ๊ตฌ์ฌ์ด ํ๋ ๋ค์ด๊ฐ ์ ์์
๊ตฌ์ฌ์ 1๋ฒ ๊ตฌ์ฌ, 2๋ฒ ๊ตฌ์ฌ, 3๋ฒ ๊ตฌ์ฌ
๊ฐ์ ๋ฒํธ๋ฅผ ๊ฐ์ง ๊ตฌ์ฌ์ด ๋ฒํธ๊ฐ ์ฐ์ํ๋ ์นธ์ ์์ผ๋ฉด, ๊ทธ ๊ตฌ์ฌ์ ์ฐ์ํ๋ ๊ตฌ์ฌ
๋ฐฉํฅ di์ ๊ฑฐ๋ฆฌ si
4๊ฐ์ง ๋ฐฉํฅ ↑, ↓, ←, →๊ฐ ์๊ณ , ์ ์ 1, 2, 3, 4
์์ด๋ di ๋ฐฉํฅ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ si ์ดํ์ธ ๋ชจ๋ ์นธ์ ์ผ์ ํํธ์ ๋์ ธ ๊ทธ ์นธ์ ์๋ ๊ตฌ์ฌ์ ๋ชจ๋ ํ๊ดด
๊ตฌ์ฌ์ด ํ๊ดด๋๋ฉด ๊ทธ ์นธ์ ๊ตฌ์ฌ์ด ๋ค์ด์์ง ์์ ๋น ์นธ
์ผ์ ํํธ์ ๋ฒฝ์ ์๋ก ๋จ์ด์ง๊ธฐ ๋๋ฌธ์, ๋ฒฝ์ ํ๊ดด๋์ง ์์
1) ์ด๋ค ์นธ A์ ๋ฒํธ๋ณด๋ค ๋ฒํธ๊ฐ ํ๋ ์์ ์นธ์ด ๋น ์นธ์ด๋ฉด, A์ ์๋ ๊ตฌ์ฌ์ ๊ทธ ๋น ์นธ์ผ๋ก ์ด๋ (๊ฑ ๋ค์ ์๋ ๊ตฌ์ฌ์ด ์ญ๋ฅด๋ฅต ๋น์นธ ์ฑ์ฐ๋)
์ด ์ด๋์ ๋ ์ด์ ๊ตฌ์ฌ์ด ์ด๋ํ์ง ์์ ๋๊น์ง ๋ฐ๋ณต
2) ๊ตฌ์ฌ์ด ํญ๋ฐํ๋ ๋จ๊ณ
ํญ๋ฐํ๋ ๊ตฌ์ฌ์ 4๊ฐ ์ด์ ์ฐ์ํ๋ ๊ตฌ์ฌ์ด ์์ ๋ ๋ฐ์
๊ตฌ์ฌ์ด ํญ๋ฐํด ๋น ์นธ์ด ์๊ฒผ์ผ๋ ๋ค์ ๊ตฌ์ฌ์ด ์ด๋
๊ตฌ์ฌ์ด ์ด๋ํ ํ์๋ ๋ค์ ๊ตฌ์ฌ์ด ํญ๋ฐํ๋ ๋จ๊ณ์ด๊ณ , ์ด ๊ณผ์ ์ ๋ ์ด์ ํญ๋ฐํ๋ ๊ตฌ์ฌ์ด ์์๋๊น์ง ๋ฐ๋ณต
3) ๊ตฌ์ฌ์ด ๋ณํํ๋ ๋จ๊ณ
์ฐ์ํ๋ ๊ตฌ์ฌ์ ํ๋์ ๊ทธ๋ฃน
1๋ฒ ๊ตฌ์ฌ์ ๋นจ๊ฐ์, 2๋ฒ ๊ตฌ์ฌ์ ํ๋์, 3๋ฒ ๊ตฌ์ฌ์ ๋ณด๋ผ์
ํ๋์ ๊ทธ๋ฃน์ ๋ ๊ฐ์ ๊ตฌ์ฌ A์ B๋ก ๋ณํจ
๊ตฌ์ฌ A์ ๋ฒํธ๋ ๊ทธ๋ฃน์ ๋ค์ด์๋ ๊ตฌ์ฌ์ ๊ฐ์
B๋ ๊ทธ๋ฃน์ ์ด๋ฃจ๊ณ ์๋ ๊ตฌ์ฌ์ ๋ฒํธ
๊ตฌ์ฌ์ ๋ค์ ๊ทธ๋ฃน์ ์์๋๋ก 1๋ฒ ์นธ๋ถํฐ ์ฐจ๋ก๋๋ก A, B์ ์์๋ก ์นธ์ ๋ค์ด๊ฐ
๊ตฌ์ฌ์ด ์นธ์ ์๋ณด๋ค ๋ง์ ์นธ์ ๋ค์ด๊ฐ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๊ทธ๋ฌํ ๊ตฌ์ฌ์ ์ฌ๋ผ์ง
๋ง๋ฒ์ฌ ์์ด๋ ๋ธ๋ฆฌ์๋๋ฅผ ์ด M๋ฒ ์์
์์ ํ ๋ง๋ฒ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋,
1×(ํญ๋ฐํ 1๋ฒ ๊ตฌ์ฌ์ ๊ฐ์) + 2×(ํญ๋ฐํ 2๋ฒ ๊ตฌ์ฌ์ ๊ฐ์) + 3×(ํญ๋ฐํ 3๋ฒ ๊ตฌ์ฌ์ ๊ฐ์)
์ฒซ์งธ ์ค์ N, M
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฒฉ์์ ๋ค์ด์๋ ๊ตฌ์ฌ์ ์ ๋ณด
r๋ฒ์งธ ํ์ c๋ฒ์งธ ์ ์๋ (r, c)์ ๋ค์ด์๋ ๊ตฌ์ฌ์ ๋ฒํธ
์ด๋ค ์นธ์ ๊ตฌ์ฌ์ด ์์ผ๋ฉด 0์ด ์ฃผ์ด์ง
์์ด๊ฐ ์๋ ์นธ๋ ํญ์ 0์ด ์ฃผ์ด์ง
๋ค์ M๊ฐ์ ์ค์๋ ๋ธ๋ฆฌ์๋ ๋ง๋ฒ์ ๋ฐฉํฅ di์ ๊ฑฐ๋ฆฌ si
from collections import deque
# ํ ๋ค์ด๋ ์ขํ ๋ฃ์ด์ฃผ๊ธฐ
def indexing():
cx, cy = n // 2, n // 2
move = 0
# ํ ๋ค์ด๋์ฒ๋ผ ์ผ, ์๋, ์ค๋ฅธ, ์
nx = [0, 1, 0, -1]
ny = [-1, 0, 1, 0]
while True:
# ์์ด๊ฐ ์๋ ์์น (n/2, n/2)๋ถํฐ ์ข->ํ->์ฐ->์์ ๋ฐ๋ณต
# 1, 1, 2, 2, 3, 3, ..., n-1, n-1, n
for i in range(4):
if i % 2 == 0:
move += 1
for _ in range(move):
cx += nx[i]
cy += ny[i]
graphIdx.append((cx, cy))
if cx == 0 and cy == 0:
return
# 1) ๋งค์ง~ ์์
def magic(dir, dist):
x, y = n // 2, n // 2
# 4๊ฐ์ง ๋ฐฉํฅ ↑, ↓, ←, →๊ฐ ์๊ณ , ์ ์ 1, 2, 3, 4
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for i in range(dist):
x += dx[dir]
y += dy[dir]
if x < 0 or x >= n or y < 0 or y >= n:
break
# ํํธ ๋ง์์ผ๋ ๋ค ์์ด์ ธ๋ผ!
board[x][y] = 0
# ์ฑ์!
fill_blank()
# 4๊ฐ ์ฐ์์ด๋ฉด ํญ๋ฐ!
while bomb():
# ๋ค์ ์ฑ์!
fill_blank()
# ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด!
grouping()
# 2) ๋น์นธ ์ฑ์์ฑ์
def fill_blank():
blankIdx = deque()
for x, y in graphIdx:
# 0์ธ ์นธ์ ๋ฐ๊ฒฌํ๋ฉด ๊ทธ ์นธ์ blankIdx๋ผ๋ ํ์ ๋ฃ์ด์ค ์ํ
if board[x][y] == 0:
blankIdx.append((x, y))
# ๋น ์นธ์ ๋ง๋์ง ์์์ ๋, ํ์์ ๋น์นธ์ ์ธ๋ฑ์ค๋ฅผ ๊บผ๋ด์ด
elif board[x][y] > 0 and blankIdx:
nx, ny = blankIdx.popleft()
# ๊ทธ ์นธ์ ํ์ฌ ์นธ์ ์๋ฅผ ๋ฃ์ด์ฃผ๊ณ
board[nx][ny] = board[x][y]
# ํ์ฌ ์นธ์ 0์ผ๋ก ๋ง๋ค์ด์ค์ผ๋ก์จ ๋น๊ฒจ์ฃผ๊ธฐ
board[x][y] = 0
# ๋ชจ๋ ๋น๊ฒจ์ง ๋ ๊น์ง ๋ฐ
blankIdx.append((x, y))
# 3) ์ฐ์๋ ์ซ์๊ฐ 4์นธ ์ด์ ์กด์ฌํ๋ค๋ฉด ๊ทธ ์นธ๋ค์ ํญ๋ฐ
def bomb():
visited = deque()
cnt = 0
num = -1
flag = False
for x, y in graphIdx:
# ์ ์นธ๊ณผ ๊ฐ์ ์ซ์๊ฐ ๋ฐ์ํ๋ค๋ฉด ์นด์ดํธ๋ฅผ ๋๋ ค๋๊ฐ
if num == board[x][y]:
visited.append((x, y))
cnt += 1
else:
# ์ ์๊ณ์ฐ์ ํด์ผ ํ๋ฏ๋ก ์ ์๋ ํจ๊ป ์ ์ฅ
if cnt >= 4:
score[num - 1] += cnt
flag = True
while visited:
nx, ny = visited.popleft()
# ์ ์ฅํ๊ณ ์๋ ์์ ์นด์ดํธ๊ฐ 4 ์ด์์ด๋ผ๋ฉด ํญ๋ฐ
# ๊ทธ ์นธ๋ค์ ๋ชจ๋ 0์ผ๋ก ๋ฐ๊ฟ
if cnt >= 4:
board[nx][ny] = 0
num = board[x][y]
cnt = 1
visited.append((x, y))
return flag
def grouping():
cnt = 1
tmpx, tmpy = graphIdx[0]
num = board[tmpx][tmpy]
nums = []
for i in range(1, len(graphIdx)):
x, y = graphIdx[i][0], graphIdx[i][1]
if num == board[x][y]:
cnt += 1
else:
nums.append(cnt)
nums.append(num)
num = board[x][y]
cnt = 1
idx = 0
for x, y in graphIdx:
if not nums:
break
board[x][y] = nums[idx]
idx += 1
if idx == len(nums):
break
# N X N ๊ฒฉ์, ๋ง๋ฒ์ฌ ์์ด๋ ๋ธ๋ฆฌ์๋๋ฅผ ์ด M๋ฒ ์์
n, m = map(int, input().split())
# N๊ฐ์ ์ค์๋ ๊ฒฉ์์ ๋ค์ด์๋ ๊ตฌ์ฌ์ ์ ๋ณด
board = [list(map(int, input().split())) for _ in range(n)]
cmd = []
answer = 0
score = [0] * 3
graphIdx = deque()
for i in range(m):
# ๋ธ๋ฆฌ์๋ ๋ง๋ฒ์ ๋ฐฉํฅ di์ ๊ฑฐ๋ฆฌ si
d, s = map(int, input().split())
cmd.append((d, s))
indexing()
for a, b in cmd:
magic(a - 1, b)
for i in range(3):
answer += (i + 1) * score[i]
print(answer)
์์ ์ ๋ ฅ
7 1
0 0 0 0 0 0 0
3 2 1 3 2 3 0
2 1 2 1 2 1 0
2 1 1 0 2 1 1
3 3 2 3 2 1 2
3 3 3 1 3 3 2
2 3 2 2 3 2 3
2 2
์์ ์ถ๋ ฅ
28
์........
๋๋ฐ ์ด๋ ต๋ค
๋๋ฌด ์ด๋ ค์
ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ
๊ฐ์ฌํฉ๋๋ค..
https://hongcoding.tistory.com/134
https://chelseashin.tistory.com/108
728x90
๋ฐ์ํ
'๐ฆฅ ์ฝํ > BAEKJOON' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BAEKJOON python] 19238_์คํํธ ํ์ (0) | 2023.04.08 |
---|---|
[BAEKJOON python] 23290_๋ง๋ฒ์ฌ ์์ด์ ๋ณต์ (0) | 2023.04.08 |
[BAEKJOON python] 21610_๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ผ๊ธฐ (0) | 2023.04.07 |
[BAEKJOON python] 20058_๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด์คํฐ (0) | 2023.04.07 |
[BAEKJOON python] 20057_๋ง๋ฒ์ฌ ์์ด์ ํ ๋ค์ด๋ (0) | 2023.04.07 |
Comments