프로그래머스 - (Java)단체사진 찍기
알고리즘/프로그래머스

프로그래머스 - (Java)단체사진 찍기

https://programmers.co.kr/learn/courses/30/lessons/1835

 

코딩테스트 연습 - 단체사진 찍기

단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두

programmers.co.kr

1. 유형

구현, 순열

 

2. 로직

  1. 순열 구하기
  2. 사람들끼리의 거리를 구한다
  3. data배열의 조건대로 내가 구한 순열이 만족한지 판단

각 사람들끼리 떨어진 거리는 String.indexOf를 사용해서 쉽게 구할수 있었다.

 

3. 코드

class Solution {
    static char info[] = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
    static int answer;
    public int solution(int n, String[] data) {
        answer = 0;
        permutation(0, "", new boolean[8], data);
        return answer;
    }
    static void permutation(int depth, String line, boolean visited[], String[] data){
        if(depth == 8){
            if(checkdata(line, data))
                answer++;
            return;
        }
        for(int i=0; i<8; i++){
            if(!visited[i]){
                visited[i] = true;
                permutation(depth+1, line+info[i], visited, data);
                visited[i] = false;
            }
        }
    }
    static boolean checkdata(String line, String[] datas){
        for(String data: datas){
            int index1 = line.indexOf(data.substring(0,1));
            int index2 = line.indexOf(data.substring(2,3));
            int num = data.charAt(4)-'0';
            char cmd = data.charAt(3);
            if(!checkcmd(Math.abs(index1-index2)-1, num, cmd)){
                return false;
            } 
        }
        return true;
    }
    static boolean checkcmd(int len, int num, char cmd){
        switch(cmd){
            case '=':
                if(len==num)
                    return true;
                else
                    return false;
            case '>':
                if(len>num)
                    return true;
                else
                    return false;
            case '<':
                if(len<num)
                    return true;
                else
                    return false;
            default:
                return false;
        }
    }
}
/*
로직
1) 순열 perm(int depth, String line, int index)
2) data판단
*/