https://www.acmicpc.net/problem/20165
N,M,R=map(int,input().split())
board=[list(map(int,input().split())) for _ in range(N)]
forRestore=[row[:] for row in board]
dx={'E':0,'W':0,'S':1,'N':-1}
dy={'E':1,'W':-1,'S':0,'N':0}
def isIn(x,y):
if x<0 or y<0 or x>=N or y>=M:
return False
return True
answer=0
for r in range(R):
attackX,attackY,attackD=map(str,input().split())
defenX,defenY=map(int,input().split())
attackX,attackY=int(attackX)-1,int(attackY)-1
defenX,defenY=defenX-1,defenY-1
fallH=board[attackX][attackY]
while isIn(attackX,attackY) and fallH>0:
if board[attackX][attackY]!=0:
fallH=max(board[attackX][attackY]-1,fallH-1)
board[attackX][attackY]=0
answer+=1
else:
fallH-=1
attackX+=dx[attackD]
attackY+=dy[attackD]
board[defenX][defenY]=forRestore[defenX][defenY]
print(answer)
for i in range(N):
for j in range(M):
if board[i][j]>0:
print('S',end=' ')
else:
print('F',end=' ')
print()
도미노를 두고 공격수와 수비수를 두어 넘어트리는 상황과 다시 세우는 상황을 시뮬레이션 하는 문제이다. 공격수가 넘어트릴 때는 방향이 주어지며 높이에 따라 연쇄반응을 일으키는 점이 중점이다.
먼저 라운드마다 공격수와 수비수의 입력을 받아와서 저장한다. 공격수의 경우, 해당 높이를 먼저 받아온다. 이 높이 만큼 이제 진행할 것이기 때문이다. 그렇기에 주어진 방향으로 이동하면서 기본적으로 높이를 -1해주어야 한다. 하지만 현재 높이를 저장한 변수보다 더 큰 수가 나타나면 연쇄반응으로 더 멀리까지 쓰러트릴 수 있으므로 이로 바꾸어 갱신해주어야 한다. 이런식으로 보드판 밖으로 나가거나 더 이상 쓰러트릴 높이가 없을 때까지 진행해주면 된다.
수비수는 단순히 기존의 높이를 다시 세워주면 된다. 출력은 S와 F로 구분하여 출력하여 준다.
이렇게 Python으로 백준의 "인내의 도미노 장인 호석" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊