Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 브루트포스
- 플로이드와샬
- 이분탐색
- Spring
- GIT
- 투 포인터
- 조합
- 비트마스킹
- 백트래킹
- 우선순위큐
- 파이썬
- 크루스칼
- 구현
- 2018 KAKAO BLIND RECRUITMENT
- 플로이드 와샬
- SWEA
- 2020 KAKAO BLIND RECRUITMENT
- 프로그래머스
- BFS
- 다익스트라
- 시뮬레이션
- 백준
- 최소 신장 트리
- 2020 카카오 인턴십
- 스택
- 트라이
- 2019 KAKAO BLIND RECRUITMENT
- 로봇 청소기
- 투포인터
- 2021 KAKAO BLIND RECRUITMENT
Archives
- Today
- Total
개발조아
[BOJ/백준] 20165 인내의 도미노 장인 호석 파이썬 본문
728x90
문제 링크 : https://www.acmicpc.net/problem/20165
어렵지 않은 시뮬레이션 문제이다.
나는 큐와 도미노의 상태와 도미노의 높이를 나타낼 배열을 사용했다.
공격 알고리즘은 아래와 같다.
도미노를 쓰러트릴때 일단 시작 좌표를 큐에 넣는다.
그리고 큐가 빌때까지 아래 동작을 수행한다.
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()
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 7682 틱택토 (0) | 2021.09.27 |
---|---|
[BOJ/백준] 19942 다이어트 파이썬 (0) | 2021.09.26 |
[BOJ/백준] 4577 소코반 파이썬 (0) | 2021.09.19 |
[BOJ/백준] 1662 압축 파이썬 (0) | 2021.09.19 |
[BOJ/백준] 1162 도로포장 파이썬 (0) | 2021.09.17 |
Comments