Part6.11_완전탐색_깊이,넓이 우선탐색활용_등산경로(DFS)

Eugenius1st·2022년 2월 10일
0

Python_algorithm

목록 보기
55/83


드디어 했음..
BFS는 근데 아직 어려움 ㅎㅎ

내가 생각한 코드

import sys
sys.stdin = open("input.txt", "rt")

dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
def DFS(x, y):
    global cnt
    if ch[endPoint[0]][endPoint[1]] == 1:
        cnt+=1
    else:
        for i in range(4):
            xx = x + dx[i]
            yy = y + dy[i]
            if 0 <= xx <= (N-1) and 0 <= yy <= (N-1) and board[x][y] < board[xx][yy] and ch[xx][yy] == 0:
                ch[xx][yy] = 1
                DFS(xx,yy)
                ch[xx][yy]=0

if __name__ == "__main__":
    N = int(input())  
    cnt = 0
    board = [list(map(int,input().split())) for _ in range(N)]
    ch = [[0]*N for _ in range(N)]
    max = -2147000000
    min = 2147000000
    for i in range(N):
        for j in range(N):
            if max < board[i][j]:
                max = board[i][j]
                endPoint = (i,j)
            if min > board[i][j]:
                min = board[i][j]
                startPoint = (i,j)
    ch[startPoint[0]][startPoint[1]] = 1
    DFS(startPoint[0],startPoint[1])
    print(cnt)

이전 문제와 다른 것은, 시작 점과 끝 점이 다르다는 점이다.
또한 값이 점점 커지면서 상하좌우로 움직일 수 있다.
만약 상 하 좌 우 중 현재위치하는 값보다 작은 경우에는 위치 이동이 불가하다.

선생님 코드

import sys
sys.stdin = open("input.txt", "rt")

dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
def DFS(x, y):
    global cnt
    if x == ex and y == ey:
        cnt+=1
    else:
        for k in range(4):
            xx = x + dx[k]
            yy = y + dy[k]
            if 0 <= xx < N and 0 <= yy < N and board[x][y] < board[xx][yy] and ch[xx][yy] == 0:
                ch[xx][yy] = 1
                DFS(xx,yy)
                ch[xx][yy]=0

if __name__ == "__main__":
    N = int(input())  
    cnt = 0
    board = [[0]*N for _ in range(N)] # 지도의 정보를 입력하는 배열  
    ch = [[0]*N for _ in range(N)]
    max = -2147000000
    min = 2147000000
    
    for i in range(N):
        tmp = list(map(int,input().split())) # 한 줄을 읽는다. min&max 확인용 고정된 배열
        for j in range(N):
            if tmp[j] < min:
                min = tmp[j]
                sx=i
                sy=j
            if tmp[j] > max:
                max = tmp[j]
                ex=i
                ey=j
            board[i][j] = tmp[j] # 한 줄을 복사해 놓는다.
    ch[sx][sy] = 1
    DFS(sx, sy)
    print(cnt)

나와 다른 점
1. 변수 이름이 알기 쉽다
2. 배열을 하나 더 만드셨음 >> for문 돌기 용이해보임

profile
최강 프론트엔드 개발자가 되고싶은 안유진 입니다

0개의 댓글