https://programmers.co.kr/learn/courses/30/lessons/1835
풀이
특별할 거 없이 8!가지의 위치 조합을 순열 함수를 통해 구하고, 조건문에 해당하면 1씩 더해주어 answer를 return하면 됩니다. 문자열 처리를 살짝 곁들인 백트래킹? 백준이면 실버 1 정도 될 듯합니다.
역시 카카오가 문제 퀄리티가 좋네요.
배운 점
프로그래머스에서는 채점 시 solution을 여러 번 사용하기에, 전역변수를 선언했다면 solution마다 초기화해줄 필요가 있다고 합니다... 🤔
코드
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
73
74
75
76
77
78
79
|
import java.util.*;
class Solution {
static int ans;
static int[] loc = new int[8];
static boolean[] visited = new boolean[8];
static int[][] conditions;
public int solution(int n, String[] data) {
ans = 0;
loc = new int[8];
visited = new boolean[8];
conditions = new int[n][4];
// 프렌즈들을 숫자로 처리하기 위한 HashMap
HashMap<Character, Integer> map = new HashMap<>();
map.put('A', 0);
map.put('C', 1);
map.put('F', 2);
map.put('J', 3);
map.put('M', 4);
map.put('N', 5);
map.put('R', 6);
map.put('T', 7);
for (int i = 0; i < n; i++) {
// 조건을 8!의 경우마다 편하게 쓰기 위해 처리
int x1 = map.get(data[i].charAt(0));
int x2 = map.get(data[i].charAt(2));
int y = 0;
if (data[i].charAt(3) == '=') {
y = 0;
} else if (data[i].charAt(3) == '<') {
y = -1;
} else {
y = 1;
}
int x3 = data[i].charAt(4) - '0';
conditions[i][0] = x1;
conditions[i][1] = x2;
conditions[i][2] = y;
conditions[i][3] = x3;
}
perm(0);
return ans;
}
// 순열
void perm(int cnt) {
if (cnt == 8) {
if (valid()) ans++;
return;
}
for (int i = 0; i < 8; i++) {
if (visited[i]) continue;
visited[i] = true;
loc[cnt] = i;
perm(cnt+1);
visited[i] = false;
}
}
// 가능한지 판단하는 method
boolean valid() {
for (int i = 0; i < conditions.length; i++) {
if (conditions[i][2] == -1) {
if (Math.abs(loc[conditions[i][0]] - loc[conditions[i][1]]) >= conditions[i][3] + 1) return false;
}
else if (conditions[i][2] == 0) {
if (Math.abs(loc[conditions[i][0]] - loc[conditions[i][1]]) != conditions[i][3] + 1) return false;
}
else {
if (Math.abs(loc[conditions[i][0]] - loc[conditions[i][1]]) <= conditions[i][3] + 1) return false;
}
}
return true;
}
}
|
cs |
'PS > Backtracking' 카테고리의 다른 글
백준 17136번: 색종이 붙이기 (Java) (0) | 2022.07.18 |
---|---|
백준 1062번: 가르침 (JAVA) (0) | 2022.05.16 |
백준 9663번: N-Queen (JAVA) (0) | 2022.04.06 |
백준 2239번: 스도쿠 (JAVA) (0) | 2022.04.06 |
백준 1941번: 소문난 칠공주 (JAVA) (0) | 2022.04.05 |