ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Programmers] 단체사진 찍기
    Algorithm/Programmers 2020. 12. 28. 23:46

    [2017 카카오코드 본선] 단체사진 찍기

    programmers.co.kr/learn/courses/30/lessons/1835#

     

     

    Solution

    • permutation으로 모든 캐릭터의 순서를 구한다음 조건에 맞는지 체크하는 방식으로 풀었다.
    • 캐릭터의 위치를 저장하기 위해 알파벳을 idx로 하는 배열을 만들어 위치를 저장했는데 그렇게 할 필요없이 map으로 위치를 저장하는 방법도 있었다.

     

     

    소스코드

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    import java.util.*;
     
    class Solution {
        static int[] kakaoFriends = {0'C' - 'A''F' - 'A''J' - 'A''M' - 'A''N' - 'A''R' - 'A''T' - 'A'};
        static int[] a;
        static boolean[] c;
        static String[] conditions;
        static int count;
     
        public static int solution(int n, String[] data) {
            int answer = 0;
     
            a = new int[kakaoFriends.length];
            c = new boolean[kakaoFriends.length];
            conditions = data;
            count = 0;
     
            permutation(0);
            answer = count;
            System.out.println(count);
            return answer;
        }
     
        private static void permutation(int len) {
            if (len == a.length) {
                int[] idx = new int[26];
                for (int i = 0; i < a.length; i++) {
                    idx[kakaoFriends[i]] = a[i];
                }
     
                if (check(idx)) count++;
                return;
            }
     
            for (int i = 0; i < a.length; i++) {
                if (c[i]) continue;
                a[len] = i;
                c[i] = true;
                permutation(len + 1);
                c[i] = false;
            }
        }
     
        private static boolean check(int[] idx) {
            char A, B, C;
            int D;
     
            for (int i = 0; i < conditions.length; i++) {
                A = conditions[i].charAt(0);
                B = conditions[i].charAt(2);
                C = conditions[i].charAt(3);
                D = conditions[i].charAt(4- '0';
     
                int distance = Math.abs(idx[A - 'A'- idx[B - 'A']) - 1;
                if (C == '=') {
                    if (distance != D) {
                        return false;
                    }
                } else if (C == '<') {
                    if (distance >= D) {
                        return false;
                    }
                } else {
                    if (distance <= D) {
                        return false;
                    }
                }
            }
     
            return true;
        }
    }
    cs

    댓글

Designed by Tistory.