728x90
반응형
https://www.acmicpc.net/problem/21922
문제
학부 연구생으로 새로 연구실에 들어온 민상이는 사용할 자리를 정하려고 한다.
연구실은 격자 모양으로 되어있고 에어컨에서 바람이 상,하,좌,우 4 방향으로 분다. 물론 에어컨이 위치한 곳에도 바람이 분다.
민상이는 더위를 많이 타서 에어컨 바람이 지나가는 곳 중 하나를 선택하여 앉으려고 한다.
연구실에는 다양한 물건들이 있어 바람의 방향을 바꾼다.
연구실에 있는 물건의 종류는 총 4가지가 있다. 아래 화살표의 의미는 바람이 각 물건에서 바람의 이동을 표시한 것이다.
연구실 어디든 민상이가 앉을 수 있는 자리이다. 즉 에어컨이 위치한 자리와 물건이 있는 자리 모두 앉을 수 있다.
민상이가 원하는 자리는 몇 개 있는지 계산해주자.
입력
첫 번째 줄에는 연구실의 크기가 세로 N(1 ≤ N ≤ 2,000), 가로 M(1 ≤ M ≤ 2,000) 순으로 주어진다.
두 번째 줄부터 N + 1 줄까지 연구실 내부 구조 정보를 알려주는 값 M개가 주어진다.
1,2,3,4는 위에서 설명한 물건의 종류이다.
9는 에어컨을 의미하고, 0은 빈 공간을 의미한다.
에어컨은 0개 이상 50개 이하가 들어온다.
출력
민상이가 원하는 자리의 개수를 출력한다.
풀이
Code
import sys
input = sys.stdin.readline
# 1. 바람 방향 변경 함수 정의
def change_dir(dir, object) :
# 1-1. 3번 물건인 경우
if object == 3 :
# 변경된 바람 방향 반환
return ChangeDir_3[dir]
# 1-2. 4번 물건인 경우
else :
# 변경된 바람 방향 반환
return ChangeDir_4[dir]
# 2. 바람 이동 함수 정의
def move(x, y, dir) :
# 2-1.
while 0 <= x < n and 0 <= y < m :
# 2-2-1. 현재 위치에 해당 바람의 방향이 지나간 적이 있다면 return
if dir in graph[x][y] : return
# 2-2-2, 그래프에 현재 위치 방향 정보 업데이트
graph[x][y].append(dir)
# 2-2-3. 현재 위치에 물건이 있는 경우
# 물건에 막히는 경우
# 1번 물건이면서 바람이 좌우로 부는 경우
# 2번 물건이면서 바람이 상하로 부는 경우
if (classroom[x][y] == 1 and dir in [2, 3]) or (classroom[x][y] == 2 and dir in [0, 1]) : return
# 바람이 꺾이는 물건이 있을 경우
elif classroom[x][y] in [3, 4] :
# 바람 방향 변경
dir = change_dir(dir, classroom[x][y])
# 2-2-4. 다음 위치 설정
x, y = x + dirs[dir][0], y + dirs[dir][1]
# 3. 앉을 수 있는 자리 계산 함수 정의
def calculate() :
cnt = 0
# 3-1.
for i in range(n) :
for j in range(m) :
# 바람이 지나가는 자리 체크
if graph[i][j] : cnt += 1
# 3-2. 앉을 수 있는 자리 수 반환
return cnt
n, m = map(int, input().split())
classroom = [list(map(int, input().split())) for _ in range(n)]
# 4. 3번 물건으로 인한 바람 방향 변경 딕셔너리 생성
ChangeDir_3 = {0 : 3, 1 : 2, 2: 1, 3 : 0}
# 5. 4번 물건으로 인한 바람 방향 변경 딕셔너리 생성
ChangeDir_4 = {0 : 2, 1 : 3, 2: 0, 3 : 1}
# 6. 방향 리스트 생성
dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]
# 7. 에어컨 위치 인덱스 리스트 생성
air_conditioner = []
for i in range(n) :
for j in range(m) :
if classroom[i][j] == 9 :
air_conditioner.append((i, j))
# 8. 그래프 생성
graph = [ [ [] for _ in range(m)] for _ in range(n) ]
# 9.
for x, y in air_conditioner :
# 9-1.
for dir in range(4) :
# 바람 이동
move(x, y, dir)
# 10. 앉을 수 있는 자리 출력
print(calculate())
728x90
반응형
'Coding Test > Baekjoon' 카테고리의 다른 글
[Python/BOJ] 1914. 하노이 탑 (0) | 2024.06.29 |
---|---|
[Python/BOJ] 15486. 퇴사 2 (0) | 2024.06.24 |
[Python/BOJ] 2608. 로마 숫자 (0) | 2024.06.22 |
[Python/BOJ] 2096. 내려가기 (0) | 2024.06.17 |
[Python/BOJ] 14728. 벼락치기 (1) | 2024.06.13 |