Tiny Bunny
본문 바로가기
Algorithm/Python

[BOJ #31575] 도시와 비트코인

by nowag 2024. 3. 18.

문제

전날에 비해 비트코인의 시세가 백만원이나 오른 어느 아침, 진우는 거래소에 가서 비트코인을 매도하려고 한다. 현재 비트코인의 시세가 점점 떨어지고 있기 때문에 진우는 최대한 빨리 거래소에 가야 한다.

도시는 가로 N, 세로 M 크기의 격자 모양으로 이루어졌다. 진우는 북서쪽 끝에 있고 거래소는 남동쪽 끝에 있다. 도시의 일부 구역은 공터 또는 도로라서 진우가 지나갈 수 있지만, 어떤 구역은 건물이 있어서 진우가 갈 수 없다.

진우는 최대한 빨리 거래소에 가야 하므로, 동쪽(오른쪽) 또는 남쪽(아래쪽)으로만 이동하여 거래소로 도착할 수 있어야 한다. 진우를 도와 거래소로 갈 수 있는지 구하는 프로그램을 작성하여라. 진우의 현재 위치가 거래소일 수 있다.

 

입력

첫 번째 줄에 도시의 가로 크기 과 세로 크기  (1 ≤ N, M ≤ 300)이 주어진다.

두 번째 줄부터 개의 줄에는 도시의 형태를 나타내는 개의 정수가 공백을 사이에 두고 주어진다. 각 칸이 1인 경우 진우가 갈 수 있는 칸을 의미하고 0인 경우 진우가 갈 수 없는 칸을 의미한다.

왼쪽 위의 끝 칸과 오른쪽 아래의 끝 칸은 모두 1이다.

 

출력

첫 번째 줄에 진우가 거래소로 갈 수 있으면 Yes를, 그렇지 않으면 No를 출력한다.

 

내가 쓴 코드

# 동 남
di = [0, 1]
dj = [1, 0]

def bitcoin(i, j):
    global ans
    visited[i][j] = 1
    if i == M - 1 and j == N - 1:
        ans = 'Yes'
        return ans
    for k in range(2):
        ni = i + di[k]
        nj = j + dj[k]
        if 0 <= ni < M and 0 <= nj < N:
            if dosi[ni][nj] == 1 and visited[ni][nj] == 0:
                bitcoin(ni, nj)

N, M = map(int, input().split())
dosi = [list(map(int, input().split())) for _ in range(M)]
visited = [[0] * N for _ in range(M)]
ans = 'No'
bitcoin(0, 0)
print(ans)

이 문제를 풀고 느꼈다. 나는 DFS를 못한다. 이거 진짜 DFS 기초 중에 기초 문제 같은데,,, 이걸 이렇게 오랫동안 힘들게 갖고 있었다는건... 못하는거지 머 ^^ 나중에 dfs 문제 싸그리 모아서 아무 도움 받지 않고 나 혼자 힘으로 다 풀어 봐야겠다!! 연습만이 살 길이다 ㅎㅎ^^*

 

제출 결과

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ #18870] 좌표 압축  (2) 2024.03.18
[SWEA #11892] 분할정복 - 퀵정렬  (2) 2024.03.18
[BOJ #2178] 미로 탐색  (2) 2024.03.17
[BOJ #1092] 배  (0) 2024.03.14
[BOJ #7983] 내일 할거야  (3) 2024.03.14