내 잡다한 노트

6087 레이저 통신 파이썬 본문

백준, 프로그래머스(파이썬)

6087 레이저 통신 파이썬

peanutwalnut 2022. 3. 9. 21:23

문제 : https://www.acmicpc.net/problem/6087

 

6087번: 레이저 통신

크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서

www.acmicpc.net

 

소스 코드

 

import sys
from collections import deque

W, H = map(int, sys.stdin.readline().split())
# H가 세로
mapp = [list(map(str, sys.stdin.readline().strip())) for _ in range(H)]

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
startx = starty = endx = endy = -1
for i in range(H):
    for j in range(W):
        if mapp[i][j] == 'C':
            if startx == -1:
                startx, starty = i, j
            else:
                endx, endy = i, j

visited = [[-1] * W for _ in range(H)]
q = deque()
q.append((startx, starty))
visited[startx][starty] = 0

while q:
    x, y = q.popleft()
    for k in range(4):
        nx, ny = x+dx[k], y+dy[k]
        while 0<= nx < H and 0<= ny < W:
            if mapp[nx][ny] == "*":
                break
            if visited[nx][ny] == -1:
                visited[nx][ny] = visited[x][y] + 1
                q.append((nx, ny))
            nx += dx[k]
            ny += dy[k]

print(visited[endx][endy] - 1)


 

어려워서 다른 분의 도움을 많이 받았음.

90도로 꺽이는 이동을 따로 계산한다는 건 가중치가 달라진다는 의미이다. 그렇게 하지 말고

가중치를 같은 1로 만들기 위한 방법이다.

거울을 설치한다는 것은 직선의 방향을 바꾸는 것

그래서 최소 직선의 개수 - 1 = 거울의 개수 이다.

 

소스 코드의 아이디어는 보통 bfs는 인접한 네 방향을 큐에 넣어서 진행시키는데

이 문제에서는 해당 방향의 정점들을 '*' 이라는 벽에 닿을 때까지 계속해서 큐에 넣는 것이다.

같은 직선상은 같은 그룹을 가지게 되고 가중치가 다 같은 상태에서 bfs를 할 수 있게 된다.

 

'백준, 프로그래머스(파이썬)' 카테고리의 다른 글

파이썬 백준 16724 피리부는 사나이  (0) 2022.04.03
6064 카잉 달력 파이썬  (0) 2022.03.28
10159 저울 [파이썬]  (0) 2022.03.23
2294 동전2 파이썬  (0) 2022.03.13
16236 아기상어 파이썬  (0) 2022.03.09