728x90
https://www.acmicpc.net/problem/9205
저는 dfs를 사용하였습니다.
DFS를 사용하는 이유: 거리가 되는 모든 방향을 탐색해야 하기 때문
https://www.acmicpc.net/board/view/86660
x와 y의 값이 1000(20X50) 이하이면 갈 수 있다
1000보다 크면 갈 수 없다
입력 받기
from sys import stdin
t = int(stdin.readline())
result = []
for _ in range(t):
n = int(stdin.readline()) # 편의점 개수
home_x, home_y = map(int, stdin.readline().split())
store = []
for _ in range(n):
store.append(list(map(int, stdin.readline().split())))
festival_x, festival_y =map(int, stdin.readline().split())
1. 페스티벌에서 집까지
1-1. 바로 갈 수 있다 -> happy 출력
1-2. 바로 못 간다 -> 편의점을 들른다
2.편의점을 for문으로 돌면서 집에서 편의점까지
2-1. 바로 갈 수 있다 -> 편의점에서 페스티벌까지 갈 수 있는 루트를 찾는다
2-2. 바로 못 간다 -> pass
집에서 바로 갈 수 있는 편의점 중 페스티벌까지 갈 수 있는지 DFS를 이용하여 확인한다.
# 페스티벌과 집까지의 거리 구함
x = festival_x-home_x if festival_x > home_x else home_x-festival_x
y = festival_y-home_y if festival_y > home_y else home_y-festival_y
# 맨해튼 거리(x+y)가 1000 이하이면
if x+y<=1000:
print('happy')
else:
hp = 'sad' # Defalut
# 편의점 돌면서
for store_x, store_y in store:
# 편의점과 집의 거리
x = store_x-home_x if store_x > home_x else home_x-store_x
y = store_y-home_y if store_y > home_y else home_y-store_y
# 1000보다 작은 것만
if x + y <= 1000:
visited = []
# 1000 안쪽의 편의점 들렸을 때, 편의점에서 페스티벌까지를 dfs로 판단
res = dfs(store_x, store_y)
if res == 1:
hp = 'happy'
break
print(hp)
DFS 함수
def dfs(now_x, now_y):
# visit
visited.append((now_x, now_y))
# festival이랑 거리 봐 -> 되면 happy
x = now_x-festival_x if now_x > festival_x else festival_x-now_x
y = now_y-festival_y if now_y > festival_y else festival_y-now_y
if x + y <= 1000:
return True
# 안되면 다른 편의점 가
for s_x, s_y in store:
if (s_x, s_y) not in visited: # 들르지 않은 곳 중
# 지금 위치랑 편의점 위치 확인
d_x = now_x-s_x if now_x > s_x else s_x-now_x
d_y = now_y-s_y if now_y > s_y else s_y-now_y
if d_x + d_y <= 1000:
# 1000 되면 가
if dfs(s_x, s_y):
return True # True가 한 번이라도 반환되면 상위도 다 True
return False
편의점에서 바로 페스티벌까지 갈 수 있는지 확인
갈 수 있다 -> True 리턴
갈 수 없다 -> 방문하지 않은 편의점 중 갈 수 있는 곳(1000이하인)을 DFS로 간다
실패 이유:
1. 처음에 집과 페스티벌이 바로 갈 수 있는 지 확인하지 않았다.
2. dfs가 끝나고 return True를 하지 않았다.
return True를 하는 이유: 상위 함수도 True를 받아서 탐색을 종료할 수 있도
'코딩테스트 문제' 카테고리의 다른 글
[Python/백준] 구간 합 구하기 5 (1) | 2024.09.28 |
---|---|
[Python/백준] RGB 거리 (0) | 2024.09.23 |
[백준/Python] 무한 수열 (1) | 2024.09.17 |
[백준/Python] 잃어버린 괄호 (1) | 2024.09.11 |
[백준/Python] 최대공약수와 최소공배수 (0) | 2024.09.11 |