[백준]#3967 매직 스타

SeungBird·2020년 8월 31일
0

⌨알고리즘(백준)

목록 보기
187/401

문제

매직 스타는 1부터 12까지 숫자가 헥사그램(hexagram)에 채워져 있는 모양으로 이루어져 있다.

매직 스타의 이름에 매직이 들어가는 이유는 숫자 네 개로 이루어진 줄의 숫자를 모두 합하면 26이 되기 때문이다. 위의 그림의 여섯 줄에 쓰여 있는 숫자는 다음과 같다.

  • 1 + 4 + 10 + 11
  • 11 + 5 + 3 + 7
  • 7 + 6 + 12 + 1
  • 2 + 10 + 5 + 9
  • 9 + 3 + 6 + 8
  • 8 + 12 + 4 + 2

매직 스타를 채우는 방법은 여러 가지가 있다. 일부만 채워진 매직 스타가 주어졌을 때, 수를 전부 다 채워서 매직 스타를 만드는 프로그램을 작성하시오.

입력

매직 스타의 모양이 주어진다. 수가 채워져 있지 않은 곳은 x로, 채워져 있는 곳은 'A'부터 'L'까지 알파벳으로 채워져 있다. i번째 알파벳은 숫자 i를 의미한다. '.'는 매직 스타의 형태를 만들기 위해서 사용하는 문자이다. 모든 입력은 예제 입력과 같은 형태로 주어진다.

출력

매직 스타를 만들 수 있는 방법 중에 사전 순으로 가장 앞서는 방법을 출력한다. (모든 줄을 순서대로 붙여서 하나의 문자열로 만든 뒤, 사전 순으로 비교한다.) 항상 정답이 존재하는 경우만 입력으로 주어진다.

예제 입력 1

....x....
.A.I.D.x.
..x...x..
.x.x.x.x.
....x....

예제 출력 1

....F....
.A.I.D.L.
..H...E..
.C.J.B.K.
....G....

풀이

이 문제는 DFS 알고리즘을 이용해서 문제의 설명대로 구현한다면 풀 수 있는 문제이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    static StringBuilder sb;
    static boolean find = false;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = "";
        boolean[] selected = new boolean[12];

        for(int i=0; i<5; i++) {
            String input = br.readLine();
            for(int j=0; j<9; j++) {
                char c = input.charAt(j);
                if(c!='.') {
                    str = str+c;
                    if(c!='x')
                        selected[c-'A'] = true;
                }
            }
        }
        dfs(selected, 0, str);
    }

    public static void dfs(boolean[] selected, int idx, String str) {
        if(find) return;

        if(idx==12) {
            if(check(str)) {
                find = true;
                print(str);
            }
            return ;
        }

        if(str.charAt(idx)!='x')
            dfs(selected, idx+1, str);

        else {
            sb = new StringBuilder(str);

            for(int i=0; i<12; i++) {
                if(!selected[i]) {
                    selected[i] = true;
                    String s = ""+(char)(i+'A');
                    sb.replace(idx, idx+1, s);
                    dfs(selected, idx+1, sb.toString());
                    sb.replace(idx, idx+1, "x");
                    selected[i] = false;
                }
            }
        }
    }

    public static void print(String str) {
        int idx = 0;

        for(int i=0; i<5; i++) {
            for(int j=0; j<9; j++) {
                if(i==0 && j==4) {
                    System.out.print(str.charAt(idx));
                    idx++;
                }

                else if(i==1 && (j==1 || j==3 || j==5 || j==7)) {
                    System.out.print(str.charAt(idx));
                    idx++;
                }

                else if(i==2 && (j==2 || j==6)) {
                    System.out.print(str.charAt(idx));
                    idx++;
                }

                else if(i==3 && (j==1 || j==3 || j==5 || j==7)) {
                    System.out.print(str.charAt(idx));
                    idx++;
                }

                else if(i==4 && j==4) {
                    System.out.print(str.charAt(idx));
                    idx++;
                }

                else
                    System.out.print(".");
            }
            System.out.println();
        }
    }

    public static boolean check(String str) {
        if(cal(str.charAt(0))+cal(str.charAt(2))+cal(str.charAt(5))+cal(str.charAt(7))!=26) return false;

        else if(cal(str.charAt(1))+cal(str.charAt(2))+cal(str.charAt(3))+cal(str.charAt(4))!=26) return false;

        else if(cal(str.charAt(0))+cal(str.charAt(3))+cal(str.charAt(6))+cal(str.charAt(10))!=26) return false;

        else if(cal(str.charAt(7))+cal(str.charAt(8))+cal(str.charAt(9))+cal(str.charAt(10))!=26) return false;

        else if(cal(str.charAt(1))+cal(str.charAt(5))+cal(str.charAt(8))+cal(str.charAt(11))!=26) return false;

        else if(cal(str.charAt(4))+cal(str.charAt(6))+cal(str.charAt(9))+cal(str.charAt(11))!=26) return false;

        else
            return true;
    }

    public static int cal(char c) {
        return c-'@';
    }
}
profile
👶🏻Jr. Programmer

0개의 댓글