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 |
Tags
- 단어 수학
- 백준2573
- 경비원
- 백준3190
- 피보나치 수의 확장
- 124 나라의 숫자
- 프로그래머스
- 백준5710
- Smart Commit
- 키패드 누르기
- 백준
- 로또의 최고 순위와 최저 순위
- 백준1788
- A와 B
- 움직이는 미로 탈출
- 파이썬
- 부스트캠프
- 소수 만들기
- 백준12904
- 코딩테스트
- 백준16234
- 백준16954
- 백준1339
- 백준 2564
- 완주하지 못한 선수
- 백준1697
- 빙산
- 백준 14499
- 전기 요금
- 인구 이동
Archives
- Today
- Total
Today.dev
[BOJ_16954/Python] 움직이는 미로 탈출 본문
문제
16954번: 움직이는 미로 탈출
욱제는 학교 숙제로 크기가 8×8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은 빈 칸 또는 벽 중 하나이다. 욱제의 캐릭터는 가장 왼쪽 아랫 칸에 있고, 이 캐릭터는 가장 오른쪽
www.acmicpc.net
풀이
import sys
from collections import deque
input = sys.stdin.readline
def bfs(x, y):
q = deque()
q.append((x, y, 0)) # x, y, 시간
dx = [-1, -1, -1, 0, 0, 0, 1, 1, 1]
dy = [-1, 0, 1, -1, 0, 1, -1, 0, 1]
while q:
x, y, time = q.popleft()
for i in range(9):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < 8 and 0 <= ny < 8:
# 현재 벽 위치
present_wall = list(filter(lambda a: 0 <= a[0] < 8 and 0 <= a[1] < 8,
list((map(lambda a: (a[0] + time, a[1]), wall)))))
if (nx, ny) not in present_wall: # 이동하려는 곳이 벽이 아님
# 캐릭터의 위치 == 벽 위치라면 게임 오버
moved_wall = list(filter(lambda a: 0 <= a[0] < 8 and 0 <= a[1] < 8,
list((map(lambda a: (a[0] + time + 1, a[1]), wall)))))
if (nx, ny) in moved_wall:
continue
# 만약 모든 벽이 나보다 아래에 있으면 게임 끝
if len(list(filter(lambda a: a[0] > nx, moved_wall))) == len(moved_wall):
return 1
# 도착했으면 게임 끝
if nx == 0 and ny == 7:
return 1
q.append((nx, ny, time + 1))
return 0 # 이동 불가
# 입력
arr = []
wall = []
for i in range(8):
line = list(input().strip())
for idx, val in enumerate(line):
if val == '#':
wall.append((i, idx))
arr.append(line)
# 풀이 & 출력
print(bfs(7, 0))
1. visited 는 캐릭터가 움직이지 않는 경우를 고려해줄 수 없어서 사용하지 않았다.
2. 이동하려는 좌표 (nx, ny)가 범위 내이고 벽이 아니라면 이동할 수 있게 한다.
3. 만약 새로 이동한 좌표에 움직인 벽이 겹쳐지면 게임 오버 (return 0)
4. 게임이 끝나는 경우는 두 가지 케이스를 생각해봤다. 목표했던 좌표에 도달하는 경우와, 모든 벽이 캐릭터 아래에 위치하는 경우다. 벽은 계속 아래로만 이동하기 때문에 캐릭터보다 아래에 위치한 벽은 캐릭터의 이동에 전혀 영향을 주지 않는다. 따라서 모든 벽이 캐릭터 아래에 위치한다면 캐릭터는 무조건 목적지에 도달할 수 있다고 처리했다.
사실 잘 짠 코드는 아니라고 생각한다. 만약 보시는 분들이 있다면 참고만 하시길.. 특히 반복할때마다 벽 위치를 계속 만들어서 판단하는게 효율적으로 많이 안 좋아보인다. 시간별로 달라지는 벽의 위치를 미리 만들어놓고 가져다 쓰면 좋을 것 같다!
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ_3190/Python] 뱀 (0) | 2021.07.05 |
---|---|
[BOJ_5710/Python] 전기 요금 (0) | 2021.07.05 |
[BOJ_1697/Python] 숨바꼭질 (0) | 2021.07.05 |
[BOJ_14499/Python] 주사위 굴리기 (0) | 2021.07.05 |
[BOJ_1339/Python] 단어 수학 (0) | 2021.05.31 |
Comments