DFS

It's me, Hyeseung·2022년 9월 30일
0

Algorithm

목록 보기
4/8
  • 인접행렬이해

    arr = [[0,1,1,0,0,0],
           [0,0,0,1,1,0],
           [0,0,0,0,0,1],
           [0,0,0,0,0,0],
           [0,0,0,0,0,0],
           [0,0,0,0,0,0],
            ]
    
    n= input()
    index = ord(n)-65
    result = []
    flag = 0
    parent = -1
    for i in range(6):
        if arr[i][index] == 1:
            parent = i
    if parent == -1: print("형제 없음")
    else:
        for j in range(6):
            if arr[parent][j] == 1 and j != index: #부모의 형제들을 리스트에 추가
                result.append(j)
                flag = 1
    
        if flag == 0:
            print('형제 없음')
            print(result)
        else:
            for m in result:
                print(chr(m+65))
  • DFS로 탐색하며 탐색하는 순서 출력하기

    name=list(input().split())  # B A C D
    arr=[
        [0,0,1,1],
        [1,0,0,0],
        [0,1,0,1],
        [0,0,0,0],
    ]
    used=[0]*4
    answer=[]
    def dfs(now):
        global answer
        answer.append(name[now])
        for i in range(4):
            if arr[now][i]==1:
                if used[i]==0:
                    used[i]=1
                    dfs(i)
    used[0]=1
    dfs(0) # B 부터 깊이우선 탐색 시작
    print(*answer)
  • 한 정점에서 다른 정점까지 갈 수 있는 방법의 개수

    **name=list(input().split())  # B A C D
    arr=[
        [0,0,1,1],
        [1,0,1,0],
        [1,0,0,1],
        [0,0,0,0],
    ]
    used=[0]*4
    cnt=0
    def dfs(now):
        global cnt
        if now==3:
            cnt+=1
        for i in range(4):
            if arr[now][i]==1 and used[i]==0:
                used[i]=1
                dfs(i)
                used[i]=0
    
    used[1]=1
    dfs(1)
    print(cnt)**
  • 출발점부터 도착지까지 갈 수 있는 방법의 개수

    Q. 출발점을 입력 받습니다. 입력받은 출발점 알파벳부터 E가 써있는 곳 까지 갈 수 있는 방법이 몇가지 있는지 출력해주세요.(A입력 시 3가지, D입력 시 1가지, B입력 시 3가지)

    name=['A','B','C','D','E']
    st=input()
    arr=[
        [0,1,0,0,0],
        [0,0,1,1,1],
        [1,0,0,1,0],
        [0,0,0,0,1],
        [0,0,0,0,0],
    ]
    used=[0]*5
    cnt=0
    def dfs(now):
        global cnt
        if name[now]=='E':
            cnt+=1
        for i in range(5):
            if arr[now][i]==1 and used[i]==0:
                used[i]=1
                dfs(i)
                used[i]=0
    
    st_index=0
    for i in range(5):
        if name[i]==st:
            st_index=i
            break
    used[st_index]=1
    dfs(st_index)
    print(cnt)
  • 도착지점에 도달할 시 최소비용 구하기

    name=['A','B','C','D','E']
    st=input()  # 출발점 입력
    arr=[
        [0,4,0,0,0],
        [0,0,1,2,9],
        [5,0,0,7,0],
        [0,0,0,0,1],
        [0,0,0,0,0],
    ]
    used=[0]*5
    
    Min=int(21e8)
    def dfs(now,sum):
        global Min
        if name[now]=='E':
            # 최소 비용 (최소 sum)
            if sum<Min:
                Min=sum
    
        for i in range(5):
            if arr[now][i]>0:
                if used[i]==0:
                    used[i]=1
                    dfs(i,sum+arr[now][i])
                    used[i]=0
    
    # 출발점의 인덱스 확인
    st_index=0
    for i in range(5):
        if name[i]==st:
            st_index=i
            break
    
    used[st_index]=1
    dfs(st_index,0)
    print(Min)
  • DFS 통한 최대값 구하기

    arr=[
        [2,5,7],
        [8,4,-8],
        [-7,1,4],
        [5,1,9]
    ]
    Max=int(-21e8)
    
    def dfs(level, sum):
        global Max
        if level==4:
            if sum>Max:
                Max=sum
            return
    
        for i in range(3):
            dfs(level+1,sum+arr[level][i])
    
    dfs(0,0) # level sum
    print(Max)
  • 술 취한 사람이 세 방향으로 이동할 수 있는데 최대값 구하기

    def dfs(now,level,sum):
        global arr,MAX
        if level == 5:
            if MAX < sum:
                MAX = sum
            return 
    
        direct = [-1,0,1]
        for i in range(3):
            dy = level
            dx = now + direct[i]
            if dx < 0 or dx > 3:continue
            if arr[dy][dx] == 0:continue
            dfs(dx,level+1,sum+arr[dy][dx])
        
    arr = [
        [3,2,4,1],
        [0,1,0,5],
        [2,0,3,0],
        [5,4,0,2],
        [2,-5,0,3]
    ]
    MAX = 0
    #첫 시작점 잡기
    for i in range(4):
        dfs(i,0,0) 
    print(MAX)
  • 0은 길이고 1은 벽인데 이동 가능 출력

0개의 댓글