๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[BAEKJOON python] 21611_๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋ธ”๋ฆฌ์ž๋“œ ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/BAEKJOON

[BAEKJOON python] 21611_๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋ธ”๋ฆฌ์ž๋“œ

์ง•์ง•์•ŒํŒŒ์นด 2023. 4. 7. 23:15
728x90
๋ฐ˜์‘ํ˜•
๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋ธ”๋ฆฌ์ž๋“œ
ํฌ๊ธฐ๊ฐ€ 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
๋ฐ˜์‘ํ˜•
Comments