https://programmers.co.kr/learn/courses/30/lessons/1835
8명을 줄세운 후에, String[] data 에 있는 문자열을 파싱해서 조건을 걸어줘서 풀었다.
근데 이게 dfs 를 할때 해쉬맵에다가 넣으면서 하니까 제출이 안되는데... 이게 원인을 모르겠네.
시작할때 초기값으로 해쉬에 char 별로 idx 를 설정해두고, 모든 idx 순서를 dfs 해서 구한후에 depth 가 8이 되었을 때 String[] data 의 조건들을 적용시켜줬다.
import java.util.Map;
import java.util.HashMap;
class Solution {
private int[] arr = new int[8];
private Map<Character, Integer> map = new HashMap<>();
private int[] visit = new int[8];
private int answer = 0;
public int solution(int n, String[] data) {
map.put('A',0);
map.put('C',1);
map.put('F',2);
map.put('J',3);
map.put('M',4);
map.put('N',5);
map.put('R',6);
map.put('T',7);
dfs(0,data);
return answer;
}
private void dfs(int depth , String[] data){
if(depth >= 8){
if(check(data)){
answer++;
}
return;
}
for(int i = 0 ; i< 8 ; i++){
if(visit[i] == 1) continue;
visit[i] = 1;
arr[depth] = i;
dfs(depth + 1, data);
visit[i] =0;
}
}
private boolean check(String[] data){
for(String tmp : data){
int from = arr[map.get(tmp.charAt(0))] ;
int to = arr[map.get(tmp.charAt(2))];
char op = tmp.charAt(3);
int range = tmp.charAt(4) - '0'+1;
int dist = Math.abs(from - to) ;
if(op == '='){
if(range != dist) return false;
}else if(op == '>'){
if(dist <= range) return false;
}else if(op == '<'){
if(dist >= range) return false;
}
}
return true;
}
}
이건 어느부분에서 문제가 되는건지 파악이 안되네...
import java.util.Map;
import java.util.HashMap;
class Solution {
private char[] arr = {'A','C','F','J','M','N','R','T'};
private Map<Character, Integer> map = new HashMap<>();
private int[] visit = new int[8];
private int answer = 0;
public int solution(int n, String[] data) {
dfs(0,data);
return answer;
}
private void dfs(int depth , String[] data){
if(depth >= 8){
if(check(data)){
answer++;
}
return;
}
for(int i = 0 ; i< 8 ; i++){
if(visit[i] == 1) continue;
map.put(arr[i],i);
visit[i] = 1;
dfs(depth + 1, data);
map.remove(arr[i]);
visit[i] = 0;
}
}
private boolean check(String[] data){
for(String tmp : data){
char from = tmp.charAt(0);
char to = tmp.charAt(2);
char op = tmp.charAt(3);
int range = tmp.charAt(4) - '0'+1;
int dist = Math.abs(map.get(from) - map.get(to)) ;
if(op == '='){
if(range != dist) return false;
}else if(op == '>'){
if(dist <= range) return false;
}else if(op == '<'){
if(dist >= range) return false;
}
}
return true;
}
}