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
- GIT
- 로봇 청소기
- 백준
- 2018 KAKAO BLIND RECRUITMENT
- 프로그래머스
- 최소 신장 트리
- 비트마스킹
- SWEA
- 플로이드와샬
- BFS
- Spring
- 다익스트라
- 백트래킹
- 2020 KAKAO BLIND RECRUITMENT
- 투포인터
- 구현
- 트라이
- 2020 카카오 인턴십
- 이분탐색
- 시뮬레이션
- 조합
- 투 포인터
- 2021 KAKAO BLIND RECRUITMENT
- 스택
- 브루트포스
- 2019 KAKAO BLIND RECRUITMENT
- 플로이드 와샬
- 우선순위큐
- 크루스칼
- 파이썬
Archives
- Today
- Total
개발조아
[BOJ/백준] 2842 집배원 한상덕 파이썬 본문
728x90
문제 링크 : https://www.acmicpc.net/problem/2842
바로 전에 풀이한 배열에서 이동과 아주 유사하다.
https://westmino.tistory.com/69
차이라면 BFS에서의 차이밖에 없다.
이 문제는 BFS시 반드시 들려야하는 점들이 있다. 해당 점들을 다 들렸을 때 피로도의 최소값을 구하는 문제이다.
일단 집의 개수를 세주고, 투포인터를 위해 높이 배열을 만들어 저장한다.
집은 이동한 거리 상관없이 지나만가면 되므로 그냥 BFS를 이용해 모든 점을 방문하면 된다.
모든 점을 방문해서 체크해줘도 되지만 반드시 들려야하는 집의 개수를 이용해도 된다.
나는 이를 이용했다.
배열에서 이동과 이점이 다를 뿐 문제는 거의 똑같다.
from sys import stdin
from collections import deque
input = stdin.readline
dx = [-1,1,0,0,1,-1,1,-1]
dy = [0,0,-1,1,1,1,-1,-1]
n = int(input())
board = []
sx=sy=-1
home_cnt = 0
for x in range(n):
board.append(input().strip())
for y in range(n):
if board[x][y] == 'P':
sx,sy=x,y
elif board[x][y] == 'K':
home_cnt += 1
stamina_board = []
stamina_list = set()
for x in range(n):
stamina_board.append(list(map(int, input().split())))
for num in stamina_board[x]:
stamina_list.add(num)
stamina_list = sorted(list(stamina_list))
visited = [[0]*n for _ in range(n)]
visited_num = 0
def solv():
low=high=0
answer = 9876543210
while low < len(stamina_list) and high < len(stamina_list):
if bfs(stamina_list[low],stamina_list[high]):
if low == high:
print(0)
return
else:
answer = min(answer,abs(stamina_list[low]-stamina_list[high]))
low += 1
else:
high += 1
print(answer)
def bfs(low,high):
global visited,visited_num
if stamina_board[sx][sy] < low or stamina_board[sx][sy] > high:
return False
visited_num += 1
q = deque([(sx,sy)])
visited[sx][sy] = visited_num
cnt = 0
while q:
x,y = q.pop()
if board[x][y] == 'K':
cnt += 1
if cnt == home_cnt:
return True
for d in range(8):
nx = x + dx[d]
ny = y + dy[d]
if point_validator(nx,ny):
if low <= stamina_board[nx][ny] <= high:
visited[nx][ny] = visited_num
q.appendleft((nx,ny))
return False
def point_validator(x,y):
if x < 0 or y < 0 or x >= n or y >= n:
return False
elif visited[x][y] == visited_num:
return False
return True
solv()
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 9519 졸려 파이썬 (0) | 2021.09.14 |
---|---|
[BOJ/백준] 8972 미친 아두이노 파이썬 (0) | 2021.09.14 |
[BOJ/백준] 1981 배열에서 이동 파이썬 (0) | 2021.09.14 |
[BOJ/백준] 15971 두 로봇 파이썬 (0) | 2021.09.13 |
[BOJ/백준] 4991 로봇 청소기 파이썬 (0) | 2021.09.13 |
Comments