Early Riser
생각정리
Early Riser
전체 방문자
오늘
어제
  • 분류 전체보기 (128)
    • JS (19)
    • React (33)
    • React Native (2)
    • Library, Tool (13)
    • CSS (2)
    • Algorithm (40)
    • Computer Science (3)
    • 회고 (3)
    • AI (13)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • 백준
  • 밑바닥
  • 딥러닝
  • 백트래킹
  • 파이썬
  • 구현
  • 비동기
  • 논문리뷰
  • js
  • boosting
  • 자바스크립트
  • 프로그래머스
  • 부스트캠프 합격
  • javascript
  • 알고리즘
  • lightgbm
  • BFS
  • react
  • dfs
  • global minima
  • 부스트캠프 9기
  • 손실함수
  • LGBM
  • 부스트캠프 합격 후기
  • local minima
  • 완전탐색
  • useState
  • useEffect
  • RNN
  • 오늘의불경

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Early Riser

생각정리

프로그래머스: 여행 경로 (파이썬, DFS, 백트래킹)
Algorithm

프로그래머스: 여행 경로 (파이썬, DFS, 백트래킹)

2022. 12. 15. 15:04

꽤나 어려운 문제였다. 코드를 짜는 것 자체는 어렵지 않았으나 문제의 엣지케이스를 생각하는데 어려움이 있어 처음에 접근을 잘못한 문제다. 

 

주어진 항공권을 모두 써야 하므로 DFS로 접근을 해야함을 알 수 있다. 이때 가능한 경로가 여러 개일수도 있는데 나는 tickets배열을 lambda식으로 정렬하면 알파벳 순서가 앞서는 경로를 탐색할 것이라 생각했다. 그러나 그렇게 풀면 테스크 케이스1에서 계속 실패했는데 이에 대한 엣지케이스를 생각하는 것이 쉽지 않았다. 

 

특정한 엣지 케이스를 생각하진 못했지만 여러개의 경로를 비교해야 하므로 백트래킹을 이용해 풀어야겠다고 생각했다. 백트래킹은 DFS의 응용으로 분기점에서 다른 경로들또한 탐색하도록 하는 알고리즘이다. 

문제에서 여행 경로의 길이는 tickets배열의 길이보다 1만큼 크다는 것을 알 수 있다. 따라서 백트래킹 시 배열의 길이가 tickets길이+1이 될때 기존 경로와 새로운 경로를 비교하도록 하면 수월하게 풀림을 볼 수 있었다.

 

다음은 내가 푼 코드의 전문이다. 

from copy import deepcopy


def dfs(node, tickets, visited):
    global cash
    global answer
    # 여행 경로의 길이는 tickets 길이에 1을 더한 값
    if len(cash) == len(tickets)+1:
        # 이미 경로를 정했는데 새로운 경로가 있을 경우
        if len(answer) == len(cash):
            j = 0
            # 기존 경로와 새로운 경로 중 알파벳 순서가 앞서는 경로를 찾기 위해 같은 index에서 서로 다른 공항값을 비교 
            while j < len(cash)-1 and answer[j] == cash[j]:
                j += 1
            first, second = answer[j], cash[j]
            if first > second:
                answer = deepcopy(cash)
        else:
            answer = deepcopy(cash)
        return

    for i in range(len(tickets)):
        if tickets[i][0] == node and not visited[i]:
            visited[i] = True
            cash.append(tickets[i][1])
            dfs(tickets[i][1], tickets, visited)
            # 백트래킹
            cash.pop()
            visited[i] = False
    return


def solution(tickets):
    global answer
    global cash
    cash = ['ICN']
    answer = []
    visited = [False for _ in range(len(tickets))]
    dfs(cash[-1], tickets, visited)
    return answer

'Algorithm' 카테고리의 다른 글

프로그래머스: 점프와 순간이동 (파이썬, 구현)  (0) 2022.12.16
프로그래머스: 가장 먼 노드(파이썬, BFS)  (0) 2022.12.15
프로그래머스: 단어 변환 (파이썬, BFS)  (0) 2022.12.14
프로그래머스: 네트워크 (파이썬, DFS)  (0) 2022.12.14
프로그래머스: 게임 맵 최단거리(파이썬, DFS, BFS)  (0) 2022.12.14
    'Algorithm' 카테고리의 다른 글
    • 프로그래머스: 점프와 순간이동 (파이썬, 구현)
    • 프로그래머스: 가장 먼 노드(파이썬, BFS)
    • 프로그래머스: 단어 변환 (파이썬, BFS)
    • 프로그래머스: 네트워크 (파이썬, DFS)
    Early Riser
    Early Riser
    2년차 프론트엔드 개발자입니다. https://github.com/EarlyRiser42

    티스토리툴바