• [level2] 프로그래머스 - 단체사진 찍기(JAVA)

    2021. 9. 3.

    by. 데롱디롱

    728x90

    [ 풀이 방법 ]

    1. 8명의 친구들을 줄세워 본다.

    2. 주어진 모든 조건에 만족하면 answer++

     

     

    [ 해설 ]

    - 카카오 프렌즈 친구 {A, C, F, J, M, N, R, T}들에게 번호를 부여한다.

     

     

    - 8명의 친구들을 차례대로 줄세우는 모든 방법을 구한다.     => 순열! perm()

    - 하나의 조합을 완성할 때 마다, 주어진 조건에 만족하는지 확인한다.     => isCorrect()

    list에는 해당 index번호를 가지고있는 프렌즈가 들어갈 위치가 저장된다.

    ex) N의 위치를 확인 하는 방법은 다음과 같다.
          = list[ 'N'의 번호 ]
          N의 번호는 friend라는 해쉬맵에 저장되어 있다.
          = list[ friend.get( 'N' ) ]
          조건에 등장하는 친구는 조건으로 주어진 문자열의 0번과 2번에 위치한다.
          = list[ friend.get( s.charAt(0) ) ]

    위의 방법으로 친구1과 친구2의 위치를 구한다.

     

     

    - '=', '>', '<'에 따라서 distance(친구 1과 친구 위치의 차이)가 부합하는지 확인 후, true 또는 false를 리턴한다.

     

     

    import java.util.HashMap;
    
    class Solution {
       static HashMap<Character, Integer> friend;
        static int list[], answer;
        static boolean isVisited[];
        static String[] s_data;
    
        static int solution(int n, String[] data) {
            s_data = data;
    
            friend = new HashMap<Character, Integer>();
            friend.put('A', 0);
            friend.put('C', 1);
            friend.put('F', 2);
            friend.put('J', 3);
            friend.put('M', 4);
            friend.put('N', 5);
            friend.put('R', 6);
            friend.put('T', 7);
    
            answer = 0;
            list = new int[8]; // 알파벳이 들어갈 위치
            isVisited = new boolean[8];
            perm(0);
    
            return answer;
        }
    
        private static void perm(int cnt) {
            if (cnt == 8) {
                if (isCorrect())
                    answer++;
                return;
            }
    
            for (int i = 0; i < 8; i++) {
                if (isVisited[i])
                    continue;
    
                isVisited[i] = true;
                list[cnt] = i;
                perm(cnt + 1);
                isVisited[i] = false;
            }
        }
    
        private static boolean isCorrect() {
            for (String s : s_data) {
                int friend1 = list[friend.get(s.charAt(0))];
                int friend2 = list[friend.get(s.charAt(2))];
                char op = s.charAt(3);
                int d = s.charAt(4) - '0' + 1;
    
                int distance = Math.abs(friend1 - friend2);
                if (op == '=') {
                    if (distance != d)
                        return false;
                } else if (op == '>' ) {
                    if(distance <= d)
                        return false;
                } else if (distance >= d)
                    return false;
            }
    
            return true;
        }
    }

     

    댓글