본문 바로가기
Algorithm/Programmers

[프로그래머스] 단체사진 찍기 자바

by YOONAYEON 2022. 1. 21.
문제

 

 

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

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

programmers.co.kr

 

 

문제 풀이

 

나는 순열 함수를 따로 만들어서 모든 경우에 한해 조건 검사하고 맞는 경우에 answer값을 증가하여 답을 구했다.

char배열에 각 이름을 담아 인덱스 번호를 이용하여 순열 결과로 나온 숫자와 매칭하여 조건 검사를 했다.

근데 검사할 때마다 모든 조건에 대해 split하고 검사하는 거라 뭔가 썩 좋은 방법같지는 않다고 생각된다...

 

 

소스 코드

 

class Solution {
    static int answer;
    static int n;
    static String[] datas;
    static char[] name = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};

    public int solution(int N, String[] Datas) {
        answer = 0;
        n = N;
        datas = Datas;
        int[] line = {0,1,2,3,4,5,6,7};
        int[] output = new int[8];
        boolean[] visited = new boolean[8];
        permutation(line, output, visited, 0, 8, 8);

        return answer;
    }

    public boolean confirm(int[] output){
        for(String data : datas){
            char[] arr = data.toCharArray();
            char a = arr[0];
            char b = arr[2];
            char operator = arr[3];
            int distance = arr[4] - '0';
            int count = 0;
            boolean check = false;

            //조건이 = 인 경우
            if(operator == '='){
                for(int i = 0; i < 8; i++){
                    if(check)
                        count++;
                    if(name[output[i]] == b || name[output[i]] == a) {
                        if(check)
                            check = false;
                        else
                            check = true;
                    }
                }
                if(count-1 != distance)
                    return false;
            }
            //조건이 > 인 경우
            else if (operator == '>'){
                for(int i = 0; i < 8; i++){
                    if(check)
                        count++;
                    if(name[output[i]] == b || name[output[i]] == a) {
                        if(check)
                            check = false;
                        else
                            check = true;
                    }
                }
                if(!(count-1 > distance))
                    return false;
            }
            //조건이 < 인 경우
            else{
                for(int i = 0; i < 8; i++){
                    if(check)
                        count++;
                    if(name[output[i]] == b || name[output[i]] == a) {
                        if(check)
                            check = false;
                        else
                            check = true;
                    }
                }
                if(!(count-1 < distance))
                    return false;
            }
        }
        return true;
    }

    public void permutation(int[] arr, int[] output, boolean[] visited, int depth, int n, int r) { 
        if(depth == r){
            if(confirm(output))
                answer++;
            return;
        }

        for(int i = 0; i < n; i++){
            if(visited[i] != true){
                visited[i] = true;
                output[depth] = arr[i];
                permutation(arr, output, visited, depth+1, n, r);
                output[depth] = 0;
                visited[i] = false;
            }
        }
    }
}