프로그래머스 문제 중 '여행경로' 문제에 대해서 블로그를 작성해보려고 한다.
우선, 입력은 다음과 같이 티켓이 주어진다.
[[ICN, JFK] , [HND, IAD], [JFK, HND]]
조건은 다음과 같다.
1. 출발지는 ICN이다.
2. 모든 티켓을 사용한다.
3. 경로가 여러개라면 알파벳 순으로 정렬해서 첫번째 티켓을 출력한다.
나머지는 길이나 부가적인 조건이다.
출력은 다음과 같다.
[ICN, JFK, HND, IAD] 와 같이 경로를 출력한다.
구현
1. 출발지는 ICN이다
-> for문을 돌며 티켓의 시작이 ICN이면 DFS를 돌린다.
2. 모든 티켓을 사용한다.
-> DFS를 돌며 티켓의 길이가 다 찼을때, 반환시킨다.
3. 알파벳 정렬
-> 티켓이 여러개일 경우
-> String으로 나열 후, 값에 대한 인덱스를 해시로 저장
-> String을 나열된 값 정렬
-> 정렬된 첫번째 값의 해당하는 인덱스의 해당하는 값 출력
코드
import java.util.*;
class Solution {
private static List<List<String>> check = new ArrayList<>();
public List<String> solution(String[][] tickets) {
Boolean[] visited = new Boolean[tickets.length];
Arrays.fill(visited, false);
for(int i=0; i<tickets.length; i++){
if(tickets[i][0].equals("ICN")){
visited[i] = true;
List<String> now = new ArrayList<>();
now.add(tickets[i][0]);
now.add(tickets[i][1]);
dfs(tickets, now, visited, tickets[i][1], 2);
visited[i] = false;
}
}
if(check.size() == 1){
return check.get(0);
}
HashMap<String, Integer> hash = new HashMap<>();
List<String> sorted_value = new ArrayList<>();
for(int j=0; j<check.size(); j++){
String value = "";
for(int i=0; i<check.get(j).size(); i++){
value += check.get(j).get(i);
}
hash.put(value, j);
sorted_value.add(value);
}
Collections.sort(sorted_value);
return check.get(hash.get(sorted_value.get(0)));
}
public void dfs(
String[][] tickets, List<String> now,
Boolean[] visited, String next, int index){
int count = 0;
for(Boolean v : visited){
if(!v){
break;
}
count += 1;
}
if(now.size() == tickets.length + 1
& count == tickets.length & now.get(0).equals("ICN")){
check.add(new ArrayList<>(now));
return;
}
for(int i=0; i<tickets.length; i++){
if(visited[i] == true){
continue;
}
if(tickets[i][0].equals(next)){
visited[i] = true;
now.add(tickets[i][1]);
bfs(tickets, now, visited, tickets[i][1], index+1);
now.remove(index);
visited[i] = false;
}
}
}
}
'Algorithm > Practice' 카테고리의 다른 글
Programmers - 가장 큰수 with JAVA (+) (0) | 2023.05.10 |
---|---|
Programmers - 디스크 컨트롤러 with JAVA (0) | 2023.05.10 |
Programmers - 구명보트 with JAVA (0) | 2023.05.08 |
Programmers - 베스트 엘범 with JAVA (0) | 2023.05.04 |
Programmers - 전력 망을 둘로 나누기 with JAVA (+) (0) | 2023.05.02 |