일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- react #리액트 #동빈나
- Dijkstra
- css #생활코딩 #웹
- 파이썬 #백준 #알고리즘 #코딩테스트
- 투포인터
- 백준
- 코딩테스트
- java #자바
- 백준 #파이썬 #알고리즘 #코딩테스트
- 알고리즘
- css #웹 #생활코딩
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 재귀
- 백준 #알고리즘 #파이썬 #코딩테스트
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- PYTHON
- 파이썬
- 다이나믹프로그래밍
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- java #자바 #동빈나
- 백트랙킹
- java #자바 #생활코딩
- 다익스트라
- 프로그래머스
- 자바 #java
- java #자바 #나동빈
- BFS
- DFS
- dp
- Today
- Total
커리까지
[백준] 26169번 세 번 이내에 사과를 먹자 파이썬 본문
문제
5 x 5 크기의 보드가 주어진다. 보드는 1 x 1 크기의 정사각형 격자로 이루어져 있다. 보드의 격자는 사과가 1개 있는 격자, 장애물이 있는 격자, 빈칸으로 되어 있는 격자로 구분된다. 격자의 위치는 (r, c)로 표시한다. r은 행 번호, c는 열 번호를 나타낸다. 행 번호는 맨 위 위치가 0이고 아래 방향으로 1씩 증가한다. 열 번호는 맨 왼쪽 위치가 0이고 오른쪽으로 1씩 증가한다. 즉, 맨 왼쪽 위 위치가 (0, 0), 맨 아래 오른쪽 위치가 (4, 4)이다.
현재 한 명의 학생이 (r, c) 위치에 있고 한 번의 이동으로 상, 하, 좌, 우 방향 중에서 한가지 방향으로 한 칸 이동할 수 있다. 학생이 사과가 있는 칸으로 이동하면 해당 칸에 있는 사과를 1개 먹는다. 장애물이 있는 칸으로는 이동할 수 없다. 학생이 지나간 칸은 학생이 해당 칸을 떠나는 즉시 장애물이 있는 칸으로 변경된다. 즉, 학생이 해당 칸에서 상, 하, 좌, 우 방향으로 한 칸 이동하는 즉시 해당 칸은 장애물이 있는 칸으로 변경된다.
학생이 현재 위치 (r, c)에서 세 번 이하의 이동으로 사과를 2개 이상 먹을 수 있으면 1을 출력하고, 그렇지 않으면 0을 출력하자.
입력
첫 번째 줄부터 다섯 개의 줄에 걸쳐 보드의 정보가 주어진다. i번째 줄의 j번째 수는 보드의 (i - 1)번째 행, (j - 1)번째 열의 정보를 나타낸다. 보드의 정보가 1이면 해당 칸은 사과가 1개 있는 격자임을 나타내고, 0이면 빈칸이 있는 격자를 나타내고, -1이면 장애물이 있는 격자임을 나타낸다.
다음 줄에 학생의 현재 위치 r, c가 빈칸을 사이에 두고 순서대로 주어진다.
출력
첫 번째 줄에 학생이 현재 위치 (r, c)에서 세 번 이하의 이동으로 사과를 2개 이상 먹을 수 있으면 1을 출력하고, 먹을 수 없으면 0을 출력한다.
제한
- 0 ≤ r, c ≤ 4
- 현재 위치 (r, c)는 빈칸이다.
예제 입력 1
0 0 1 0 0
0 0 -1 0 0
0 0 1 0 0
1 1 -1 1 0
0 0 0 -1 0
4 1
예제 출력 1
1
제출 답안
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
graph = [list(map(int, input().split())) for _ in range(5)]
visited = [[False] * 5 for _ in range(5)]
r, c = map(int, input().split())
def dfs(y, x, depth, cnt):
visited[y][x] = True
if graph[y][x] == 1:
cnt += 1
if 2 <= cnt:
return 1
if 2 < depth:
visited[y][x] = False
return 0
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if 0 <= ny < 5 and 0 <= nx < 5:
if not visited[ny][nx] and graph[ny][nx] != -1:
if dfs(ny, nx, depth + 1, cnt) == 1:
return 1
visited[y][x] = False
return 0
print(dfs(r, c, 0, 0))
'알고리즘 > 풀이' 카테고리의 다른 글
[백준] 1388번 바닥 장식 파이썬 (0) | 2023.09.17 |
---|---|
[백준] 16173번 점프왕 젤리 (Small) 파이썬 (0) | 2023.09.16 |
[백준] 25418번 정수 a를 k로 만들기 파이썬 (0) | 2023.09.15 |
[백준] 2606번 바이러스 파이썬 (0) | 2023.09.13 |
[백준] 25516번 거리가 k이하인 트리 노드에서 사과 수확하기 파이썬 (0) | 2023.09.12 |