일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 19238번
- 어른 상어
- 감소하는 수
- 파이썬
- 1789번
- 경주로 건설
- 15686번
- HTML 기초
- 베스트엘범
- 프로그래머스
- 14499번
- 백준 알고리즘
- 빛의 경로 사이클
- 미세먼지 안녕!
- 수식 최대화
- 2020 카카오 인턴십
- 1038번
- 16234번
- 17144번
- 9095번
- 12869번
- SW ExpertAcademy
- 12865번
- QueryDSL 기초
- SW Expert Academy
- 보석 쇼핑
- 스타트 택시
- 거울 설치
- 키패드 누르기
- python
Archives
- Today
- Total
보물창고 블로그
백준 알고리즘 2151번 거울 설치 풀이 With Python 본문
728x90
문제 링크: https://www.acmicpc.net/problem/2151
2151번: 거울 설치
첫째 줄에 집의 크기 N (2 ≤ N ≤ 50)이 주어진다. 다음 N개의 줄에는 N개의 문자로 집에 대한 정보가 주어진다. ‘#’는 문이 설치된 곳으로 항상 두 곳이며, ‘.’은 아무 것도 없는 것으로 빛은 ��
www.acmicpc.net
이 문제는 맨 처음 문인 '#'의 위치를 먼저 알아야 합니다. 따라서 문제에서 주어진 입력값을 통해 #의 좌표를 알아야 하고, 이후에 #의 4방향으로 집을 탐색해야 합니다. 그리고 방문할 좌표와 방향을 큐에 넣어야 하는데, 이때 큐에 넣고 꺼내어 탐색을 할 때 만약 해당 좌표와 방향으로 탐색한 적이 없거나 전에 탐색할 때보다 거울 설치 횟수가 적다면, 해당 좌표와 방향의 위치에 거울 설치 회수를 경신합니다. 저는 이것을 파이썬 자료구조인 dict로 해결하였습니다. 소스코드는 아래와 같습니다.
import sys
from collections import deque
answer = float('inf')
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
n = int(sys.stdin.readline())
board = []
door = []
for i in range(n):
s = sys.stdin.readline().rstrip()
for j in range(n):
if s[j] == '#':
door.append((i, j))
board.append(s)
queue = deque()
x, y = door[0]
visit = {}
tx, ty = door[1]
for d in range(4):
visit[(x, y, d)] = 1
nx = x + dx[d]
ny = y + dy[d]
if -1 < nx < n and -1 < ny < n:
queue.append((nx, ny, 0, d))
while queue:
x, y, count, d = queue.popleft()
if -1 < x < n and -1 < y < n:
if visit.get((x, y, d)) is None or visit[(x, y, d)] > count:
visit[(x, y, d)] = count
if x == tx and y == ty:
answer = min(count, answer)
elif board[x][y] == '!':
queue.append((x + dx[d], y + dy[d], count, d))
queue.append((x + dx[(d - 1) % 4], y + dy[(d - 1) % 4], count + 1, (d - 1) % 4))
queue.append((x + dx[(d + 1) % 4], y + dy[(d + 1) % 4], count + 1, (d + 1) % 4))
elif board[x][y] == '.':
queue.append((x + dx[d], y + dy[d], count, d))
print(answer)
소스코드에 대한 질문이 있으시면 댓글 남겨주시면 답변드리겠습니다.
'알고리즘 풀이 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 9095번 1, 2, 3 더하기 풀이 With Python (0) | 2020.07.07 |
---|---|
백준 알고리즘 7569번 토마토 풀이 With Python (0) | 2020.07.02 |
백준 알고리즘 17144번 미세먼지 안녕! 풀이 With Python (0) | 2020.06.30 |
백준 알고리즘 16234번 인구 이동 풀이 With Python (0) | 2020.06.30 |
백준 알고리즘 15686번 치킨 배달 풀이 With Python (0) | 2020.06.30 |
Comments