CS/Algorithm
[BOJ/Python] 백준 9205번 - 맥주 마시면서 걸어가기
sohy
2022. 7. 19. 01:46
백준 #9205 맥주 마시면서 걸어가기
9205번: 맥주 마시면서 걸어가기
송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다.
www.acmicpc.net
from collections import deque
import sys
input = sys.stdin.readline
def can_go(now, dest):
if abs(now[0] - dest[0]) + abs(now[1] - dest[1]) <= 1000:
return True
def bfs(home, cvs_num, cvs, fesv, visited):
q = deque()
q.append(home)
while q:
now = q.popleft()
if can_go(now, fesv): # 도착지까지 갈 수 있는지
return True
for i in range(cvs_num): # 편의점까지 갈 수 있는지
if visited[i] and can_go(now, cvs[i]):
q.append(cvs[i])
visited[i] = False
return False
t = int(input()) # 테스트 케이스 개수
for _ in range(t):
cvs_num = int(input()) # 편의점 개수
home = tuple(map(int, input().split())) # 상근이네 집 좌표
cvs = [tuple(map(int, input().split())) for _ in range(cvs_num)] # 편의점 좌표
fesv = tuple(map(int, input().split())) # 페스티벌 좌표
if bfs(home, cvs_num, cvs, fesv, [True for _ in range(cvs_num)]):
print("happy")
else:
print("sad")
BFS로 푼 문제! 편의점 위치가 가까운 순으로 입력되는 줄 알고 단순하게 연산식으로 풀었다가 순서대로 들어오는 것이 아니라고 해서 너비우선탐색으로 다시 구현했다.
- can_go 함수는 현재 위치에서 목적지까지 갈 수 있는지 계산한다.
- bfs는 현재 위치에서 페스티벌까지 갈 수 있는지, 갈 수 없다면 편의점까지 갈 수 있는지 can_go 함수를 통해 반복 확인한다.
- queue에서 좌표를 pop하여 현재 위치를 now에 저장한다.
- 현재 위치(now)에서 페스티벌까지 갈 수 있다면 바로 True를 리턴한다.
- 페스티벌까지 갈 수 없다면 갈 수 있는 편의점이 있는지 확인한다.
- 갈 수 있는 편의점이 있다면 해당 편의점 좌표를 queue에 담는다. 그리고 해당 편의점을 queue에 담았음을 visited 리스트를 통해 표시한다.
- 결국 queue에는 현재 위치에서 갈 수 있는 좌표가 담기게 된다.
- 만약 queue가 빌 때까지 True를 리턴하지 못 했다면 페스티벌까지 갈 수 없음을 의미하여 False를 리턴한다.