코딩/알고리즘

[알고리즘] 프로그래머스 단체사진 찍기 Java(자바)

유어노우 2022. 1. 7. 23:54

- 문제

 

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

 

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

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

programmers.co.kr

 

- 코드 설명

Rule class를 작성하여 data에 있는 코드를 변환해 줍니다.

 

이 코드에서 핵심은 규칙을 통해 A와 B사이의 인덱스 차이를 min , max로 설정해 주어야 합니다.

'=' 일경우 min,max는 같아야 합니다. 

'<' 일경우 숫자가 2인경우에 둘사이에 1명이하만 허용한다는 뜻하고 인덱스 차이를 고려하여 min = 1, max = num

'>' 일경우 숫자가 2인경우 둘사이에 최소 3명 최대 6명까지 허용합니다(ex A의 index1일때  B의 최소 index가 5이상이어야함 따라서 둘의 차이는 4) min = num + 2 ,max =7가 되어야 한다.

 

order는 카카오 캐릭터들의 배열이 저장되어있는 문자열이고 다배치가 되어야 규칙검사를 시작한다.

이것을 재귀로 풀이했으며 다른분들의 코드를 보니 정말 다양한 방법이 많았습니다.

 

class Solution {
    static String[] persons;
    static int answer; 
    static Rule[] rules;
    
    public int solution(int n, String[] data) {
        int len = data.length;
        answer = 0;
        persons = new String("A C F J M N R T").split(" ");
        rules = new Rule[len];
        boolean[] visited = new boolean[persons.length];

        for(int i=0; i<len; i++){
            rules[i] = new Rule(data[i]);
        }
        
        sol(visited, new String(),0);
        return answer;
    }
    static void sol(boolean[] visited, String order, int level){
        if(level == 8){
            for(Rule r : rules){
                if(r.check(order) == false) return;
            }
            answer++;
            return;
        }
        
        for(int i=0; i<8; i++){
            if(visited[i] == false){
                visited[i] = true;
                sol(visited, order.concat(persons[i]), level + 1);
                visited[i] = false;
            }
        }
    }
}

class Rule{
    String A;
    String B;
    int min;
    int max;
    public Rule(String rule){
        char op = rule.charAt(3);
        int num = rule.charAt(4) - '0';
        A = Character.toString(rule.charAt(0));
        B = Character.toString(rule.charAt(2));
        if(op == '='){
            min = num+1;
            max = num+1;
        }
        else if(op =='<'){
            min = 1;
            max = num;
        }
        else if(op == '>'){
            min = num+2;
            max = 7;
        } 
    }
    public boolean check(String order){
        int idxA = order.indexOf(this.A);
        int idxB = order.indexOf(this.B);
        int result = Math.abs(idxA - idxB);

        if( min<= result && result <=max){    
            return true;
        }
        else
            return false;
    }
}

 

- 결과