728x90
DFS, BFS 문제입니다.
티켓이 주어지고 모든 도시를 방문할 때 경로를 출력해야합니다.
결과가 여러개라면 알파벳 순서가 앞서는 경로를 출력하면 됩니다.
불가능 한 경우는 없으며, 모든 티켓을 사용해야합니다.
27 * 27 * 27 = 19683이므로 19684크기의 배열을 만들어주었습니다.
문자를 해당 인덱스에 매핑시켜서 넣어주었습니다.
갈 수 있는 곳을 알파벳 순으로 정렬해주었습니다.
방문 배열을 만들어서 같은곳을 방문하지 않게 하여 최초 성공했을때를 출력해주었습니다.
import java.util.*;
class Solution {
static ArrayList<ArrayList<Integer>> al;
static boolean[][] visit;
static int size;
static ArrayList<Integer> result;
public String[] solution(String[][] tickets) {
al = new ArrayList<>();
visit = new boolean[19684][10001];
size = tickets.length;
result = new ArrayList<>();
String[] answer = new String[tickets.length + 1];
boolean chk = false;
for (int i = 0; i < 19684; ++i) {
ArrayList<Integer> temp = new ArrayList<>();
al.add(temp);
}
for (int i = 0; i < tickets.length; ++i) {
int index = ConverterToInt(tickets[i][0]);
al.get(index).add(ConverterToInt(tickets[i][1]));
}
for (int i = 0; i < al.size(); ++i) {
Collections.sort(al.get(i));
}
for (int i = 0; i < al.get(6656).size(); ++i) {
visit[6656][i] = true;
if (DFS(al.get(6656).get(i), 1)) {
result.add(6656);
chk = true;
break;
}
visit[6656][i] = false;
}
for (int i = 0; i < tickets.length + 1; ++i) {
answer[i] = ConverterToString(result.get(tickets.length - i));
}
return answer;
}
public static boolean DFS(int num, int cnt) {
if (cnt == size) {
result.add(num);
return true;
}
for (int i = 0; i < al.get(num).size(); ++i) {
if (!visit[num][i]) {
visit[num][i] = true;
if (DFS(al.get(num).get(i), cnt + 1)) {
result.add(num);
return true;
}
visit[num][i] = false;
}
}
return false;
}
public static int ConverterToInt(String s) {
int num1 = s.charAt(0) - 'A' + 1;
int num2 = s.charAt(1) - 'A' + 1;
int num3 = s.charAt(2) - 'A' + 1;
num1 *= 27 * 27;
num2 *= 27;
return num1 + num2 + num3;
}
public static String ConverterToString(int num) {
char char3 = (char) ((num % 27) + 'A' - 1);
num /= 27;
char char2 = (char) ((num % 27) + 'A' - 1);
num /= 27;
char char1 = (char) ((num % 27) + 'A' - 1);
String s = Character.toString(char1) + Character.toString(char2) + Character.toString(char3);
return s;
}
}
'알고리즘' 카테고리의 다른 글
[Java] 백준 2792번 보석 상자 (0) | 2023.08.23 |
---|---|
[Java] 백준 25682번 체스판 다시 칠하기 2 (0) | 2023.08.22 |
[Java] 백준 3967번 매직스타 (0) | 2023.08.20 |
[Java] 백준 2374번 같은 수로 만들기 (1) | 2023.08.19 |
[Java] 백준 16434번 드래곤 앤 던전 (0) | 2023.08.19 |