๐ [ํ๋ก๊ทธ๋๋จธ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด] ๋จ์ฒด์ฌ์ง ์ฐ๊ธฐ ๋ฌธ์ ํ์ด (2017 ์นด์นด์ค ์ฝ๋)
๐ ๋ฌธ์
๋จ์ฒด์ฌ์ง ์ฐ๊ธฐ (2017 ์นด์นด์ค ์ฝ๋) https://programmers.co.kr/learn/courses/30/lessons/1835
๐ ์ ๊ทผ๋ฒ
๋จ์ฒด์ฌ์ง ์ฐ๊ธฐ ๋ฌธ์ ์ ๋๋ค.
8๋ช ์ ์นด์นด์คํ๋ ์ฆ๊ฐ ๋จ์ฒด์ฌ์ง์ ์ฐ๊ธฐ ์ํด ์ผ๋ ฌ๋ก ์์ผ ํฉ๋๋ค. ์ผ๋ ฌ๋ก ์ธ์ฐ๊ธฐ ์ํ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
์ฒ์์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๊ธฐ์ ์ํ์ ์ผ๋ก ์ ๊ทผํ์ผ๋ ์คํจํ์๊ณ
์ด 8๋ช ๋ฐ์ ๋์ง ์๊ธฐ ๋๋ฌธ์ brute force๋ก ์ ๊ทผํ์ต๋๋ค.
์์ด์ ์ด์ฉํด 8๋ช ์ ์ธ์์ผ๋ก ์ธ์ธ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ง๋ค๊ณ
๋จ, ์ฌ์ง์ ์ฐ๊ธฐ ์ํด ์ผ๋ ฌ๋ก ์ธ์ฐ๊ธฐ ์ํ ์กฐ๊ฑด๋ค์ ๋ชจ๋ ๋ถํฉํด์ผ ํ๋ฏ๋ก
์ผ๋ ฌ๋ก ์ธ์ฐ๋ ๊ฐ ๊ฒฝ์ฐ์ ์ ๋ง๋ค ์ผ๋ ฌ๋ก ์ธ์ฐ๊ธฐ ์ํ ์กฐ๊ฑด๋ค์ ๋ชจ๋ ๋ถํฉํ๋์ง ํ์ธํด์ฃผ์์ต๋๋ค.
์กฐ๊ฑด๋ค์ ํ์ธํ ๋ ์๊ธฐ ์์ ๊ณผ ๋น๊ต ๋์์ ์์น๋ฅผ ํ์ธํด์ผ ํ๋๋ฐ
์ด ์์น๋ฅผ ๋ฐ๋ก ํ์ธํ ์ ์๋๋ก
๊ฐ ๊ฒฝ์ฐ์ ์๋ง๋ค ์ค์ ์ธ์ธ ๋ Map ์ ์ด์ฉํด์
๊ฐ ํ๋ ์ฆ์ ์์น๋ฅผ ์ ์ฅํด์ฃผ์์ต๋๋ค.
๊ทธ๋์ ์กฐ๊ฑด๋ค์ ํ์ธํ ๋
๋น๊ต ๋์ ๋๋ช ์ ๋ํด์ ๋ฐ๋ก Map(lineUpInfo) ์์ ์์น๋ฅผ ๊บผ๋ด ํ์ธํ ์ ์๋๋ก ํ์์ต๋๋ค.
์ด ์กฐ๊ฑด์ ์ผ์นํ ๋๋ง๋ค count๋ฅผ 1์ฉ ๋๋ ค์ฃผ๋ฉด ๋ต์ ๊ตฌํ ์ ์์ต๋๋ค.
๐ป ์ฝ๋
package problem.programmers;
import java.util.HashMap;
import java.util.Map;
class Solution_๋จ์ฒด์ฌ์ง์ฐ๊ธฐ {
private static final int FRIENDS_COUNT = 8;
static char[] sequence;
static boolean[] visited;
static char[] friends;
static int count;
public static int solution(int n, String[] data) {
init();
permutation(0, data);
return count;
}
private static void init() {
sequence = new char[FRIENDS_COUNT];
visited = new boolean[FRIENDS_COUNT];
friends = new char[]{'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
count = 0;
}
private static void permutation(int depth, String[] data) {
if (depth == FRIENDS_COUNT) {
Map<Character, Integer> lineUpInfo = lineUp();
if (isAbleLineUp(lineUpInfo, data)) {
count++;
}
return;
}
for (int i = 0; i < FRIENDS_COUNT; i++) {
if (!visited[i]) {
visited[i] = true;
sequence[depth] = friends[i];
permutation(depth + 1, data);
visited[i] = false;
}
}
}
private static HashMap<Character, Integer> lineUp() {
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < FRIENDS_COUNT; i++) {
map.put(sequence[i], i);
}
return map;
}
private static boolean isAbleLineUp(Map<Character, Integer> lineUpInfo, String[] conditions) {
for (int i = 0; i < conditions.length; i++) {
if (!isCorrectToCondition(conditions[i], lineUpInfo)) {
return false;
}
}
return true;
}
private static boolean isCorrectToCondition(String condition, Map<Character, Integer> map) {
char origin = condition.charAt(0); //origin
char target = condition.charAt(2); //orign๊ณผ ๋น๊ต๋์
char sign = condition.charAt(3); //์กฐ๊ฑด ๋ถํธ
int num = condition.charAt(4) - '0'; //์กฐ๊ฑด์ ํด๋น๋๋ ๊ฑฐ๋ฆฌ
if (sign == '=') {
int distance = Math.abs(map.get(origin) - map.get(target)) - 1;
if (distance == num) {
return true;
}
}
if (sign == '<') {
int distance = Math.abs(map.get(origin) - map.get(target)) - 1;
if (distance < num) {
return true;
}
}
if (sign == '>') {
int distance = Math.abs(map.get(origin) - map.get(target)) - 1;
if (distance > num) {
return true;
}
}
return false;
}
}