[6087] 레이저 통신 (BFS)

2023. 6. 13. 10:12·Coding Test/Graph
728x90
 

6087번: 레이저 통신

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

www.acmicpc.net

 

분석

  1. 어떤 칸에서 이동할 수 있는 정점은 인접한 네 칸이 아닌 같은 방향 일직선
  2. 한번에 이동할 수 있는 방향을 한번에 큐에 넣음
  3. 이동 경로가 바뀌면 거울이 필요
  4. 거울의 개수 = 직선의 개수 구한 뒤 -1 한 값
  5. (sx,sy) 에서 (ex,ey)로 가는 최단거리를 구하는 문제

 

풀이

"""
W×H 크기의 지도
레이저는 C에서만 발사할 수 있고, 빈 칸에 거울('/', '\')을 설치해서 방향을 90도 회전시킬 수 있다.
빈 칸은 '.', 벽은 '*'로 나타냈다. 왼쪽은 초기 상태, 오른쪽은 최소 개수의 거울을 사용해서 두 'C'를 연결한 것이다.
C를 연결하기 위해 설치해야 하는 거울 개수의 최솟값을 출력
"""
from collections import deque
dx = [0,0,1,-1]
dy = [1,-1,0,0]
W,H=map(int, input().split())
a=[input() for _ in range(H)]
sx=sy=ex=ey=-1
for i in range(H):
    for j in range(W):
        if a[i][j] == 'C':
            if sx == -1:
                sx,sy = i,j
            else:
                ex,ey = i,j
dist = [[-1]*W for _ in range(H)]
q = deque()
dist[sx][sy] = 0
q.append((sx,sy))

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 a[nx][ny] == '*':  # 벽
                break
            if dist[nx][ny] == -1:  # 방문하지 않았다면
                dist[nx][ny]=dist[x][y]+1  # 직선의 길이 +1
                q.append((nx,ny))
            nx += dx[k]
            ny += dy[k]

for i in range(H):
    for j in range(W):
        print(dist[i][j], end="  ")
    print()
print(dist[ex][ey]-1)

 

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'Coding Test/Graph' 카테고리의 다른 글
  • [16930] 달리기 (BFS)
  • [14221] 편의점 (다익스트라)
  • 봉우리 (네방향 탐색, 이중 for 문, all 함수)
  • 위상정렬(그래프 정렬)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Algorithm
    조합
    스택
    동적계획법
    최대공약수
    BFS
    덱
    자료구조
    이분탐색
    구간합
    구현
    최단거리
    프로그래머스
    플로이드워셜
    다익스트라
    정렬
    LIS
    월간코드챌린지
    재귀
    큐
    파이썬
    알고리즘
    DFS
    그래프
    힙
    최소신장트리
    백준
    그리디
    DP
    트리
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[6087] 레이저 통신 (BFS)
상단으로

티스토리툴바