๐Ÿ“– [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด] ๋‹จ์ฒด์‚ฌ์ง„ ์ฐ๊ธฐ ๋ฌธ์ œ ํ’€์ด (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;
    }
}

Written on May 13, 2021