개발조아

[BOJ/백준] 20165 인내의 도미노 장인 호석 파이썬 본문

알고리즘/백준

[BOJ/백준] 20165 인내의 도미노 장인 호석 파이썬

개발조아 2021. 9. 21. 00:49
728x90

문제 링크 : https://www.acmicpc.net/problem/20165

 

20165번: 인내의 도미노 장인 호석

사람을 화나게 하는 법은 다양하다. 그 중에서도 악질은 바로 열심히 세워놓은 도미노를 넘어뜨리는 것이다. 이번에 출시된 보드 게임인 "너 죽고 나 살자 게임"은 바로 이 점을 이용해서 2명이

www.acmicpc.net

 

어렵지 않은 시뮬레이션 문제이다.

 

나는 큐와 도미노의 상태와 도미노의 높이를 나타낼 배열을 사용했다.

 

공격 알고리즘은 아래와 같다.

 

도미노를 쓰러트릴때 일단 시작 좌표를 큐에 넣는다.

그리고 큐가 빌때까지 아래 동작을 수행한다.

 

1. 큐에서 좌표를 빼고 현재점은 쓰러트리는 점이므로 score를 +1 해준다.

2. 시작 좌표 도미노의 높이-1 만큼 해당 방향으로 도미노를 쓰러트린다. 이때 범위 벗어나는지 체크하자.

3. 만약 세워진 도미노라면 큐에 해당 좌표를 넣고 도미노 상태 배열에 업데이트 시킨다.

1~3을 큐가 빌때까지 반복한다.

 

수비는 해당 좌표의 도미노 상태를 바꿔주면 끝이다.

 

모든 명령을 수행 후 score와 도미노 상태 배열을 출력하자.

 

from sys import stdin
from collections import deque

input = stdin.readline
dir = {
    'E':[0,1],
    'W':[0,-1],
    'N':[-1,0],
    'S':[1,0]
}

n,m,r = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
orders = []
status_board = [['S'] * m for _ in range(n)]
for _ in range(r):
    order = []
    x,y,d = input().split()
    order.append((int(x)-1,int(y)-1,d))

    x,y = map(int, input().split())
    order.append((x-1,y-1))
    orders.append(order)
def solv():
    score = 0
    for order in orders:
        ax,ay,d = order[0]
        if status_board[ax][ay] == 'S':
            score += attack(ax,ay,d)

        dx,dy = order[1]
        if status_board[dx][dy] == 'F':
            defense(dx,dy)

    print(score)
    for row in status_board:
        print(*row)
def attack(sx,sy,d):
    global status_board
    q = deque([(sx,sy)])
    status_board[sx][sy] = 'F'
    score = 0
    while q:
        x,y = q.pop()
        cnt = board[x][y]
        score += 1
        for _ in range(cnt-1):
            x += dir[d][0]
            y += dir[d][1]

            if not point_validator(x,y):
                break
            if status_board[x][y] == 'S':
                status_board[x][y] = 'F'
                q.appendleft((x,y))
    return score
def defense(x,y):
    global status_board
    status_board[x][y] = 'S'

def point_validator(x,y):
    if x < 0 or y < 0 or x >= n or y >= m:
        return False
    return True
solv()
Comments