-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ca8e79c
commit e34508e
Showing
1 changed file
with
72 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
--- | ||
title: "[백준/BOJ] 9205 - 맥주 마시면서 걸어가기" | ||
categories: | ||
- Algorithms | ||
tags: [Python, BOJ, BFS] | ||
toc: false | ||
toc_sticky: true | ||
toc_label: "On this page" | ||
published: true | ||
use_math: true | ||
--- | ||
|
||
20병의 맥주를 가지고 편의점을 들려 리필해가면서 페스티벌까지 갈 수 있는지를 푸는 문제로, 상황에 빗대어 만들어진 지문이지만 결국 `출발지-(중간점들)-목적지` 가 연결될 수 있는지를 판단하는 BFS/DFS 문제입니다. 문제에서 주어지는 편의점의 개수는 최대 100개로, 전체 노드 개수가 최대 102개 뿐이어서, 저는 python 의 deque 를 활용한 BFS 로 구현했습니다. | ||
|
||
지문에서 캐치해야할 포인트는 `한 번에 맥주 20병, 즉 1000미터만 움직일 수 있다` 입니다. 즉, 노드와 노드 사이의 거리가 1000 이하면 연결 가능함을 의미합니다. 좌표값은 정수 차원에서 주어지는데, 어짜피 거리는 상대좌표로 계산해야 하기 때문에 크게 신경쓰지 않아도 됩니다. 두 점 사이의 거리를 판단하는 함수 하나를 만들어두고 사용하는게 편합니다. | ||
|
||
<details> | ||
<summary> 코드 보기 </summary> | ||
``` python | ||
# 노드를 연결할 수 있는가 | ||
def is_walkable(a, b): | ||
return True if abs(a[0]-b[0])+abs(a[1]-b[1]) <= 1000 else False | ||
``` | ||
</details> | ||
|
||
지문을 슥 훑었다가 잘못 이해했던 문제였습니다. 전체 그리드 공간을 만들어서 좌표 1씩 움직이는 코드를 짰다가 뭔가 이상함을 느끼고 다시 읽었습니다. | ||
|
||
[expand]summary: 전체 코드 보기 | ||
```python | ||
import sys | ||
from collections import deque | ||
|
||
|
||
# 노드를 연결할 수 있는가 | ||
def is_walkable(a, b): | ||
return True if abs(a[0]-b[0])+abs(a[1]-b[1]) <= 1000 else False | ||
|
||
|
||
T = int(sys.stdin.readline()) | ||
for _ in range(T): | ||
n = int(sys.stdin.readline()) | ||
|
||
house = list(map(int, sys.stdin.readline().split())) | ||
cvs = [[0, 0] for _ in range(n)] | ||
for i in range(n): | ||
cvs[i] = list(map(int, sys.stdin.readline().split())) | ||
|
||
rf = list(map(int, sys.stdin.readline().split())) | ||
|
||
if is_walkable(house, rf): | ||
print('happy') | ||
continue | ||
|
||
_map = [] + [house] + cvs + [rf] | ||
_map.append(house) | ||
visited = [False for _ in range(n+2)] | ||
visited[0] = True | ||
q = deque([house]) | ||
result = False | ||
while q: | ||
_next = q.popleft() | ||
if _next[0] == rf[0] and _next[1] == rf[1]: | ||
result = True | ||
break | ||
for i in range(n+2): | ||
if not visited[i] and is_walkable(_next, _map[i]): | ||
visited[i] = True | ||
q.append(_map[i]) | ||
print('happy') if result else print('sad') | ||
``` | ||
[/expand] | ||
|