https://www.acmicpc.net/problem/9205
출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다. (맥주 한 박스당 20개)
50미터를 가려면 그 직전에 맥주 한 병을 마셔야 한다.
상근이네 집, 편의점, 펜타포트 락 페스티벌 좌표가 주어지고, 상근이네 집에서 출발해 펜타포트 락 페스티벌까지 도착해야 한다. 중간에 맥주를 사러 편의점을 들릴 수 있다. 이때 두 좌표 사이의 거리는 x 좌표의 차이 + y 좌표의 차이이다.
각 테스트 케이스에 대해서 상근이와 친구들이 행복하게 페스티벌에 갈 수 있으면 "happy", 중간에 맥주가 바닥나서 더 이동할 수 없으면 "sad"를 출력하는 프로그램
t: 테스트 케이스의 개수 (t ≤ 50)
n: 편의점의 개수 (0 ≤ n ≤ 100)
home: 상근이네 집 좌표
adjList: 편의점 좌표
fest: 펜타포트 락 페스티벌 좌표
(x, y 좌표 두 값 모두 미터, -32768 ≤ x, y ≤ 32767)
visited: 방문 처리 리스트
queue: bfs에 사용하는 큐
curX, curY: 현재 좌표
nx, ny: 다음 이동할 좌표
bfs(): 너비 우선 탐색 함수
(입력 및 선언)
(bfs 함수)
from collections import deque
t = int(input())
def bfs():
queue = deque([])
queue.append([home[0], home[1]])
while queue:
curX, curY = queue.popleft()
if abs(curX - fest[0]) + abs(curY - fest[1]) <= 1000:
return 'happy'
for element in range(n):
if not visited[element]:
nx, ny = adjList[element]
if abs(curX - nx) + abs(curY - ny) <= 1000:
queue.append([nx, ny])
visited[element] = 1
return 'sad'
for _ in range(t):
n = int(input())
adjList = []
home = [int(x) for x in input().split()]
for _ in range(n):
x, y = map(int, input().split())
adjList.append([x, y])
visited = [0 for _ in range(n+1)]
fest = [int(x) for x in input().split()]
print(bfs())
문제를 너무 어렵게 생각해서 맥주를 따로 카운트해야 하나 고민했었다.
한 병 당 50미터씩 갈 수 있고 한 박스 당 20병이 들어 있으니 1000미터까지 갈 수 있음을 계산하면 되었다.