학부 연구생으로 새로 연구실에 들어온 민상이는 사용할 자리를 정하려고 한다.
연구실은 격자 모양으로 되어있고 에어컨에서 바람이 상,하,좌,우 방향으로 분다. 물론 에어컨이 위치한 곳에도 바람이 분다.
민상이는 더위를 많이 타서 에어컨 바람이 지나가는 곳 중 하나를 선택하여 앉으려고 한다.
연구실에는 다양한 물건들이 있어 바람의 방향을 바꾼다.
연구실에 있는 물건의 종류는 총 4가지가 있다. 아래 화살표의 의미는 바람이 각 물건에서 바람의 이동을 표시한 것이다.
연구실 어디든 민상이가 앉을 수 있는 자리이다. 즉 에어컨이 위치한 자리와 물건이 있는 자리 모두 앉을 수 있다.
민상이가 원하는 자리는 몇 개 있는지 계산해주자.
입력
첫 번째 줄에는 연구실의 크기가 세로 N (1 ≤ N ≤ 2,000), 가로 M (1 ≤ M ≤ 2,000) 순으로 주어진다.
두 번째 줄부터 줄까지 연구실 내부 구조 정보를 알려주는 값 개가 주어진다.
는 위에서 설명한 물건의 종류이다.
0은 빈 공간을 의미한다.
는 에어컨을 의미하고,에어컨은 개 이상 개 이하가 들어온다.
출력
민상이가 원하는 자리의 개수를 출력한다.
풀이 과정
물건 1 : 바람이 상하로 들어오면 통과하고, 좌우로 들어오면 바람 이동을 멈춘다.
물건 2 : 바람이 좌우로 들어오면 통과하고, 상하로 들어오면 바람 이동을 멈춘다.
물건 3 : 바람이 왼쪽으로 들어오면 아래쪽으로 이동하고, 위쪽으로 들어오면 오른쪽으로 이동하고, 아래쪽으로 들어오면 왼쪽으로 이동하고, 오른쪽으로 들어오면 위쪽으로 이동한다.
물건 4 : 바람이 왼쪽으로 들어오면 위쪽으로 이동하고, 위쪽으로 들어오면 오른쪽으로 이동하고, 아래쪽으로 들어오면 왼쪽으로 이동하고, 오른쪽으로 들어오면 아래쪽으로 이동한다.
에어컨이 있을 때마다 4방향으로 바람이 이동하도록 구현한다.
import sys
input = sys.stdin.readline
n, m = map(int, input().rstrip().split())
maps = [list(map(int, input().rstrip().split())) for _ in range(n)]
on = [[0 for _ in range(m)] for _ in range(n)]
row = [-1, 1, 0, 0]
col = [0, 0, -1, 1]
for i in range(n):
for j in range(m):
if maps[i][j] == 9:
on[i][j] = 1
for d in range(4):
y = i + row[d]
x = j + col[d]
dir = d
while 0 <= y < n and 0 <= x < m:
on[y][x] = 1
if maps[y][x] == 0 or (maps[y][x] == 1 and dir <= 1) or (maps[y][x] == 2 and dir >= 2):
y += row[dir]
x += col[dir]
elif maps[y][x] == 3:
if dir == 0: dir = 3
elif dir == 1: dir = 2
elif dir == 2: dir = 1
else: dir = 0
y += row[dir]
x += col[dir]
elif maps[y][x] == 4:
if dir == 0: dir = 2
elif dir == 1: dir = 3
elif dir == 2: dir = 0
else: dir = 1
y += row[dir]
x += col[dir]
else: break
result = 0
for i in range(n): result += on[i].count(1)
print(result)
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 15659 : 연산자 끼워넣기 (3) ( GOLD 4 ) / C (0) | 2024.02.05 |
---|---|
[ BOJ ] 26598 : 색종이와 공예 ( GOLD 5 ) / Python (0) | 2024.02.05 |
[ BOJ ] 31229 : 또 수열 문제야 ( SILVER 5 ) / Python (0) | 2024.02.03 |
[ BOJ ] 16956 : 늑대와 양 ( SILVER 3 ) / Python (0) | 2024.02.03 |
[ BOJ ] 11780 : 플로이드 2 ( GOLD 2 ) / Python (1) | 2024.02.03 |