Algorithm/Programmers

[Programmers] 단체사진 찍기

goakgoak 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