알고리즘/프로그래머스
코딩테스트 연습 > 깊이/너비 우선 탐색(DFS/BFS)
vivi
2021. 9. 28. 03:53
level 2. 타겟 넘버
class Solution {
static int ans = 0;
public int DFS(int L, int[] numbers, int n, int target) {
if (L == numbers.length) {
if (n == target)
ans++;
} else {
DFS(L + 1, numbers, n + numbers[L], target);
DFS(L + 1, numbers, n - numbers[L], target);
}
return ans;
}
public int solution(int[] numbers, int target) {
int answer = 0;
answer = DFS(0, numbers, 0, target);
return answer;
}
}
level 2. 네트워크
class Solution {
static int[] check;
static int[][] board;
public void DFS(int v, int n) {
check[v] = 1;
for (int i = 0; i < n; i++) {
if (board[v][i] == 1) {
board[v][i] = 0;
DFS(i, n);
}
}
}
public int solution(int n, int[][] computers) {
int answer = 0;
board = computers;
check = new int[n];
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (board[i][j] == 1) {
check[i] = 1;
board[i][j] = 0;
answer++;
// DFS으로 연결된 컴퓨터들 제외
DFS(j, n);
}
}
}
for (int i = 0; i < n; i++)
if (check[i] == 0)
answer++;
return answer;
}
}
level 3. 단어 변환
class Solution {
static int answer;
static int[] ch;
static String Target;
static String[] Words;
public boolean comp(String cur_word, String comp_word) {
int cnt = 0;
for (int i = 0; i < cur_word.length(); i++) {
if (cur_word.charAt(i) != comp_word.charAt(i))
cnt++;
if (cnt > 1)
return false;
}
return true;
}
public void DFS(int L, String word) {
if (word.equals(Target)) {
answer = Math.min(answer, L);
} else if (L == Words.length) {
return;
} else {
for (int i = 0; i < Words.length; i++) {
if (ch[i] != 1 && comp(word, Words[i])) {
ch[i] = 1;
DFS(L + 1, Words[i]);
ch[i] = 0;
}
}
}
}
public int solution(String begin, String target, String[] words) {
answer = Integer.MAX_VALUE;
Target = target;
Words = words;
ch = new int[words.length];
DFS(0, begin);
if (answer == Integer.MAX_VALUE)
return 0;
return answer;
}
}
level 3. 여행경로
import java.util.*;
class Solution {
public String[] solution(String[][] tickets) {
String[] answer;
Map<String, PriorityQueue<String>> map = new HashMap<>();
for (int i = 0; i < tickets.length; i++) {
map.put(tickets[i][0], map.getOrDefault(tickets[i][0], new PriorityQueue<String>()));
map.get(tickets[i][0]).offer(tickets[i][1]);
}
String from = "ICN";
ArrayList<String> arr = new ArrayList<>();
arr.add(from);
for (int i = 0; i < tickets.length; i++) {
String to = map.get(from).poll();
arr.add(to);
from = to;
}
answer = new String[arr.size()];
int i = 0;
for (String str : arr)
answer[i] = arr.get(i++);
return answer;
}
}
윗 코드는 문제를 잘못 이해해서 알파벳 순서대로 방문 하였을 때 경로가 없는 경우 런타임 에러(아마도 널포인터익셉션)가 발생했다.
import java.util.*;
class Ticket implements Comparable<Ticket> {
String from, to;
Ticket(String from, String to) {
this.from = from;
this.to = to;
}
@Override
public int compareTo(Ticket o) {
return this.to.compareTo(o.to);
}
}
class Solution {
static String[] temp;
static String[] answer;
static String[][] Tickets;
static int[] ch;
static ArrayList<Ticket> arr;
static boolean flag = false;
public void DFS(int L, String from) {
if (!flag) {
if (L == Tickets.length + 1) {
if (!flag) {
flag = true;
int idx = 0;
answer = new String[Tickets.length + 1];
for (String str : temp) {
answer[idx++] = str;
}
}
} else {
for (int i = 0; i < Tickets.length; i++) {
if (ch[i] == 0 && arr.get(i).from.equals(from)) {
ch[i] = 1;
temp[L] = arr.get(i).to;
DFS(L + 1, arr.get(i).to);
ch[i] = 0;
}
}
}
}
}
public String[] solution(String[][] tickets) {
temp = new String[tickets.length + 1];
Tickets = tickets;
ch = new int[tickets.length];
arr = new ArrayList<>();
for (int i = 0; i < tickets.length; i++) {
arr.add(new Ticket(tickets[i][0], tickets[i][1]));
}
Collections.sort(arr);
temp[0] = "ICN";
DFS(1, "ICN");
return answer;
}
}
생각없는 static 남용 반성..
다음 부터는 입력 배열을 이름 같은 클래스 멤버 변수 생성해서 this로 받거나 그냥 주소를 파라미터로 넘겨줘야겠다..
문제 출처 : https://programmers.co.kr/learn/courses/30/parts/12421