[프로그래머스] 단체사진 찍기 풀이

꿀이·2022년 6월 1일
0

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;
    }
    
    
    
}
profile
내게 맞는 옷을 찾는중🔎

0개의 댓글