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 |