Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- JPA
- spring oauth
- sql 기술면접
- 백준
- java
- 파이썬
- Kotlin
- 백준 16236
- Coroutine
- JVM
- springboot
- Spring Boot
- 백준 15685
- spring cloud
- 백준 19238
- Spring
- 백준 파이썬
- re.split
- 백준 16719
- 웹어플리케이션 서버
- MySQL
- java 기술면접
- 프로그래머스
- with recursive
- 백준 17626
- spring security
- 백준 16235
- 프로래머스
- MSA
- 백준 17779
Archives
- Today
- Total
시작이 반
[백준] 19238번 (python 파이썬) 본문
SMALL
구현, 시뮬레이션 문제이다.
BFS를 이용하여 풀 수 있다.
우선 BFS를 사용하여 최단 거리에 있는 사람을 찾는다.
1. 최단거리에 있는 사람을 찾고 그 거리를 저장한다.
2. 사람을 태우고 목적지까지 다시 BFS를 이용하여 거리를 저장한다.
만약 사람이나 목적지까지 도달할 수 없으면 그즉시 종료하고 -1을 출력한다.
도달할 수 있다면
연료에서 1번을 뺏을때 음수가 나오면 종료하고 -1을 출력한다.
연료에서 1번을 뺏을때 양수면 다시 2번을 빼고 뺏을때 음수면 종료하고 -1을 출력한다.
종료가 안됐으면 연료에 2번 *2 를 더한다.
모든 사람을 태웠으면 종료하고 남은 연료를 본다.
import math
from collections import deque
n, m, energy = map(int, input().split(' '))
graph = [list(map(int, input().split(' '))) for _ in range(n)]
s_x, s_y = map(int, input().split(' '))
people = [list(map(int, input().split(' '))) for _ in range(m)]
d_x = [-1, 0, 1, 0]
d_y = [0, 1, 0, -1]
def bfs(s_x, s_y):
visited = [[-1] * n for _ in range(n)]
queue = deque()
queue.append((s_x, s_y))
visited[s_x][s_y] = 0
while queue:
pop_x, pop_y = queue.popleft()
for i in range(4):
n_x, n_y = pop_x + d_x[i], pop_y + d_y[i]
if n_x < 0 or n_x >= n or n_y < 0 or n_y >= n:
continue
if graph[n_x][n_y] == 1 or visited[n_x][n_y] != -1:
continue
visited[n_x][n_y] = visited[pop_x][pop_y] + 1
queue.append((n_x, n_y))
return visited
def check_dist(visited: list, people: list):
i = 0
for p_x, p_y, a_x, a_y in people:
people[i].append(visited[p_x - 1][p_y - 1])
i += 1
people.sort(key=lambda x: (-x[4], -x[0], -x[1]))
def solve(s_x, s_y):
global energy
while people:
visitied = bfs(s_x - 1, s_y - 1)
check_dist(visitied, people)
p_x, p_y, a_x, a_y, dist = people.pop()
for temp in people:
temp.pop()
visitied = bfs(p_x - 1, p_y - 1)
dist2 = visitied[a_x - 1][a_y - 1]
s_x, s_y = a_x, a_y
if dist == -1 or dist2 == -1:
print(-1)
return
energy -= dist
if energy < 0:
break
energy -= dist2
if energy < 0:
break
energy += dist2 * 2
if energy < 0:
print(-1)
else:
print(energy)
solve(s_x, s_y)
LIST
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 11657번 (Java 자바) (0) | 2021.08.30 |
---|---|
[백준] 17779번 (python 파이썬) (0) | 2021.04.19 |
[백준] 17626번 (python 파이썬) (0) | 2021.04.17 |
[백준] 13549번 (python 파이썬) (0) | 2021.04.17 |
[백준] 17140번 (python 파이썬) (0) | 2021.04.17 |