Skip to content

Commit

Permalink
test code
Browse files Browse the repository at this point in the history
  • Loading branch information
jinseok-moon committed Jan 5, 2023
1 parent ca8e79c commit e34508e
Showing 1 changed file with 72 additions and 0 deletions.
72 changes: 72 additions & 0 deletions _posts/Develop/Algorithms/2023-01-05-alg-boj-9205.md
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]

0 comments on commit e34508e

Please sign in to comment.