본문 바로가기

알고리즘/백준

[백준] 9205번 : 맥주 마시면서 걸어가기

728x90

https://www.acmicpc.net/problem/9205

 

9205번: 맥주 마시면서 걸어가기

송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다.

www.acmicpc.net

해당문제는 BFS탐색 문제로 현재 위치에서 갈 수 있는 최단경로를 구해야하는 문제이다. 해당 위치로 부터 갈 수 있는 거리를 구해서 탐색하면 된다. 맥주 1병을 마시면 50미터를 갈 수 있으니 상근이는 20병을 담을수 있는 상자를 들고 다니니 20*50 = 1000 의 거리까지 갈 수 있다. 따라서 현재 위치에서 1000미터 까지의 거리가 탐색 조건이다.

 

해당 문제를 처음에는 깊이우선 탐색으로 진행 하였으나 방문 체크 여부를 확인하는 로직을 잘 못 설계하여 시간복잡도 문제가 발생하였다.

최단 거리를 구하는 문제는 BFS 탐색으로 접근해야 좀 더 쉽게 풀 수 있다.

 

import sys
from collections import deque
input = sys.stdin.readline
t = int(input()) # 테스트 케이스 개수     

            
for _ in range(t):
    n = int(input()) # 편의점 개수
    house = list(map(int, input().split())) # house[0] x좌표 house[1] y좌표
    destnation = []
    festival = [] # 페스티벌 좌표 festival[0] x좌표, festival[1] y좌표 festival[2]는 도착idx
    

    destnation.append([house[0], house[1], 0])
    for i in range(n+1):
        dest = list(map(int, input().split()))
        dest.append(i+1)
        if i == n:
            festival = dest
        destnation.append(dest) # 모든 경로를 지정한다.
    finishedFlag = False
    

    visited = [False for _ in range(n+2)] # 도착 여부를 체크하는 리스트
    
    queue = deque()
    queue.append([house[0], house[1], 0])
    visited[0] = True
    while queue:
        newx, newy, index = queue.popleft()
        
        if index == festival[2]:
            finishedFlag = True
            break
        
        for dest in destnation: # 여기서 
            x,y, idx = dest
            if 1000 >= abs(x-newx) + abs(y-newy) and not visited[idx]: # 맥주 20개 x 50미터 갈 수있음. 거리가 1000 이상인 목적지와 방문하지 않는 목적지만 탐색한다.
                queue.append([x,y,idx])
                visited[idx] = True
    
    if finishedFlag :
        print("happy")
    else:
        print("sad")
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 23083번 : 꿀벌 승연이  (0) 2023.07.23
[백준] 19942번 : 다이어트  (0) 2023.07.23
[백준] 1107번 : 리모컨  (0) 2023.07.23
[백준] 1707번 : 이분 그래프  (0) 2023.07.23
[백준] 12100번 : 2048 (Easy)  (0) 2023.07.21