[프로그래머스][Java] Lv.3 여행경로

2023. 6. 12. 23:15·Algorithms(CT)


문제 정리

  • 항상 시작점은 "ICN"이어야 한다.
  • 공항을 여러 번 방문해도 상관 없지만, 항공권은 한 번 사용하면 다시 사용할 수 없다.
  • 모든 티켓을 사용해야 한다.
  • 경로가 여러 개라면, 알파벳 순서가 앞서는 경로를 return해야 한다.

 

풀이과정

  1. 경로를 알파벳 순으로 만들기 위해, tickets 배열을 알파벳 순서로 정렬합니다.
  2. 항상 시작점은 ICN이기 때문에 방문순서 List에 ICN을 넣습니다.
  3. DFS를 시작합니다.
  4. 이전 티켓의 도착지점은 다음 티켓의 시작지점이 되어야 하므로 start에 값을 넣습니다.
  5. tickets을 검사하면서 이전에 사용했던 티켓이 아니고, 티켓의 시작지점이 start와 같은지 확인합니다.
  6. 이전 도착지점과 현재 티켓의 출발지점이 같다면,
    해당 티켓을 사용하고 해당 티켓의 도착지점을 방문순서 List에 넣습니다.
  7. DFS에 여태까지 사용한 티켓수와 함께 넘겨주고, 4-7번 작업을 반복합니다.
  8. DFS 탐색 중, 모든 티켓을 사용했다면 DFS 탐색을 종료합니다.
  9. DFS탐색을 완료한 여행 경로를 반환합니다.

전체 코드

import java.util.*;
class Solution {
    static boolean[] useTicket;
    static ArrayList<String> visitOrder = new ArrayList<>(); //방문 순서
    static ArrayList<String> answerList = new ArrayList<>(); //정답 여행 경로
    public String[] solution(String[][] tickets) {
        String[] answer = {};
        
        useTicket=new boolean[tickets.length];
        
        //알파벳 순서로 정렬.
        Arrays.sort(tickets, new Comparator<String[]>(){
            @Override
            public int compare(String[] o1, String[] o2){
                if(o1[0].equals(o2[0]))
                    return o1[1].compareTo(o2[1]);
                else
                    return o1[0].compareTo (o2[0]);
            }
        });
        
        visitOrder.add("ICN"); //처음 시작은 icn
        dfs(tickets,0);
        
        answer = new String[visitOrder.size()];
        for(int i=0;i<answer.length;i++)
            answer[i]=answerList.get(i);
        
        return answer;
    }
    private void dfs(String[][] tickets, int idx){ //idx는 사용한 티켓 수.
        
        //System.out.println(visitOrder);
        //모든 티켓을 사용했으면 종료.
        if(idx==useTicket.length){
            answerList=visitOrder;
            return;
        }
        
        String start=visitOrder.get(visitOrder.size()-1); //이전 도착지
        
        for(int i=0;i<tickets.length;i++){
            if(!useTicket[i] && start.equals(tickets[i][0])){
                useTicket[i]=true;
                visitOrder.add(tickets[i][1]); //도착지 입력
                
                dfs(tickets,idx+1);
                //dfs로 탐색을 마치면 더이상 탐색하지 않음.
                if(answerList.size()>0) break;
                
                visitOrder.remove(visitOrder.size()-1);
                useTicket[i]=false;
            }
        }
    }
}

'Algorithms(CT)' 카테고리의 다른 글

[프로그래머스][Java] Lv.2 점프와 순간이동  (0) 2023.06.13
[프로그래머스][Java] Lv.2 예상 대진표  (0) 2023.06.12
[프로그래머스][Java] Lv.3 단어 변환  (0) 2023.06.11
[프로그래머스][Java] Lv.2 영어 끝말잇기  (0) 2023.06.10
[프로그래머스][Java] Lv.2 게임 맵 최단거리  (0) 2023.06.09
'Algorithms(CT)' 카테고리의 다른 글
  • [프로그래머스][Java] Lv.2 점프와 순간이동
  • [프로그래머스][Java] Lv.2 예상 대진표
  • [프로그래머스][Java] Lv.3 단어 변환
  • [프로그래머스][Java] Lv.2 영어 끝말잇기
gwee_99
gwee_99
bE bETTER!
  • gwee_99
    얼렁이와 뚱땅이
    gwee_99
  • 전체
    오늘
    어제
    • ====Category====
      • Algorithms(CT)
        • Programmers
        • Baekjoon
        • Goorm
      • Web
        • Error 해결
      • BackEnd
        • Spring
        • JPA
      • FrontEnd
        • HTML.CSS
        • JavaScript
      • Language
        • Java
      • Cloud
      • CSTS
      • Books
        • IT 5분 잡학사전
      • 일상
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    백준
    java
    자바
    개발자북클럽
    DP
    호텔 대실
    따라하며 배우는 html css
    Til
    구름
    DFS
    BFS
    lv2
    코딩테스트
    Lv.1
    HTML
    노마드코더
    스택
    Greedy
    존안님
    구름톤 챌린지
    프로그래머스
    제대로 파는 자바스크립트
    IT 5분 잡학사전
    BOJ
    LV.3
    IT 잡학사전
    lv.4
    그리디
    LV.2
    인프런
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gwee_99
[프로그래머스][Java] Lv.3 여행경로
상단으로

티스토리툴바