일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 쿠버네티스
- CSS
- 리액트
- 이더리움
- 컴퓨터공학
- next.js
- AWS
- JavaScript
- TypeScript
- HTML
- 프론트엔드
- 이슈
- k8s
- 클라우드
- 가상화
- 알고리즘
- VUE
- 웹
- 타입스크립트
- 파이썬
- 백엔드
- react
- BFS
- 백준
- docker
- es6
- 블록체인
- 자바스크립트
- kubernetes
- 솔리디티
Archives
- Today
- Total

즐겁게, 코드
백준 16469번 : 소년 점프 본문
16469번: 소년 점프
첫째 줄에 미로의 행과 열의 크기를 나타내는 자연수 R과 C가 주어진다. (2 ≤ R, C ≤ 100) 다음 R줄에 걸 쳐 길이 C로 이루어진 각 줄의 미로의 정보가 공백 없이 주어진다. 숫자 0은 이동 가능한
www.acmicpc.net
BFS에 약간의 잡기술을 얹은 문제입니다.
풀이가 복잡하지는 않은데, 이걸 설명하려 하니 뭔가 복잡해질 것 같아 적당히 "이렇게 푼 사람도 있구나" 하시고 봐주셔도 될 것 같습니다.
[정답 코드 - Python]
import sys
from collections import deque
input = sys.stdin.readline
R, C = map(int, input().split())
visitedA = [[-1] * C for _ in range(R)]
visitedB = [[-1] * C for _ in range(R)]
visitedC = [[-1] * C for _ in range(R)]
dy = [1, 0, -1, 0]
dx = [0, 1, 0, -1]
minRoute = 1e9
minCount = 0
board = []
for _ in range(R):
board.append(list(input()))
Ay, Ax = map(int, input().split())
By, Bx = map(int, input().split())
Cy, Cx = map(int, input().split())
def bfs(startNode, villianType):
q = deque()
y, x = startNode
if villianType == 'A':
visitedA[y - 1][x - 1] = 0
elif villianType == 'B':
visitedB[y-1][x-1] = 0
elif villianType == 'C':
visitedC[y-1][x-1] = 0
q.append((y - 1, x - 1))
while q:
y, x = q.popleft()
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if 0 <= ny < R and 0 <= nx < C:
if villianType == 'A':
if visitedA[ny][nx] == -1 and board[ny][nx] == '0':
q.append((ny, nx))
visitedA[ny][nx] = visitedA[y][x] + 1
elif villianType == 'B':
if visitedB[ny][nx] == -1 and board[ny][nx] == '0':
q.append((ny, nx))
visitedB[ny][nx] = visitedB[y][x] + 1
elif villianType == 'C':
if visitedC[ny][nx] == -1 and board[ny][nx] == '0':
q.append((ny, nx))
visitedC[ny][nx] = visitedC[y][x] + 1
bfs((Ay, Ax), 'A')
bfs((By, Bx), 'B')
bfs((Cy, Cx), 'C')
for row in range(R):
for col in range(C):
if visitedA[row][col] > -1 and visitedB[row][col] > -1 and visitedC[row][col] > -1:
temp = max(visitedA[row][col],
visitedB[row][col], visitedC[row][col])
if minRoute > temp:
minRoute = temp
minCount = 1
elif minRoute == temp:
minCount += 1
if minCount != 0:
print(minRoute)
print(minCount)
else:
print(-1)
반응형
'💯 알고리즘 > 백준 온라인 저지' 카테고리의 다른 글
백준 2992번 : 크면서 작은 수 (2) | 2021.10.20 |
---|---|
백준 1417번 : 국회의원 선거 (0) | 2021.09.22 |
파이썬에서 우선순위 큐 사용하기 (0) | 2021.09.21 |
백준 1182번 : 부분수열의 합 (1) | 2021.09.12 |
백준 6603번 : 로또 (0) | 2021.09.04 |
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆