알고리즘

백준 16113번 시그널 (JAVA)

박카스마시며코딩 2023. 12. 17. 22:52

https://www.acmicpc.net/problem/16113

 

16113번: 시그널

zxcvber는 외계인을 연구하는 과학자다. 그는 지난 10년간 우주에서 오는 시그널를 연구했지만, 아무런 성과가 없었다. 그러던 어느 날, 갑자기 우주에서 이상한 시그널이 오기 시작했다. zxcvber는

www.acmicpc.net

 

저는 구현을 통해 문제를 풀었습니다.

 

package BOJ.simulation;

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

public class BOJ_16113 {
    private static final char[][][] NUMBER = new char[][][]{
        { // 0
            {'#','#','#'},
            {'#','.','#'},
            {'#','.','#'},
            {'#','.','#'},
            {'#','#','#'},
        },
        { // 1
            {'#'},
            {'#'},
            {'#'},
            {'#'},
            {'#'},
        },
        { // 2
            {'#','#','#'},
            {'.','.','#'},
            {'#','#','#'},
            {'#','.','.'},
            {'#','#','#'},
        },
        { // 3
            {'#','#','#'},
            {'.','.','#'},
            {'#','#','#'},
            {'.','.','#'},
            {'#','#','#'},
        },
        { // 4
            {'#','.','#'},
            {'#','.','#'},
            {'#','#','#'},
            {'.','.','#'},
            {'.','.','#'},
        },
        { // 5
            {'#','#','#'},
            {'#','.','.'},
            {'#','#','#'},
            {'.','.','#'},
            {'#','#','#'},
        },
        { // 6
            {'#','#','#'},
            {'#','.','.'},
            {'#','#','#'},
            {'#','.','#'},
            {'#','#','#'},
        },
        { // 7
            {'#','#','#'},
            {'.','.','#'},
            {'.','.','#'},
            {'.','.','#'},
            {'.','.','#'},
        },
        { // 8
            {'#','#','#'},
            {'#','.','#'},
            {'#','#','#'},
            {'#','.','#'},
            {'#','#','#'},
        },
        { // 9
            {'#','#','#'},
            {'#','.','#'},
            {'#','#','#'},
            {'.','.','#'},
            {'#','#','#'},
        },
    };
    private static final char BLOCK = '#';
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int s = Integer.parseInt(br.readLine());
        String str = br.readLine();
        int n = 5;
        int m = s/5;
        char[][] map = new char[n][m];
        int index = 0;
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < m ; j++){
                map[i][j] = str.charAt(index++);
            }
        }
        StringBuilder result = new StringBuilder();
        for(int i = 0 ; i < m ; i++){
            if(map[0][i] != BLOCK){
                continue;
            }
            int number = findNumber(i,map,n,m);
            result.append(number);
//            System.out.println(i+" "+number);
            if(number != 1){
                i += 3;
            }
        }
        System.out.println(result);
    }

    private static int findNumber(int index, char[][] map,int n,int m) {
        if(isOne(index,map,n,m)){
            return 1;
        }
        for(int num = 0 ; num < 10 ; num++){
            if(num == 1){
                continue;
            }
            boolean flag = true;
            for(int i = 0 ; i < n ; i++){

                for(int j = 0 ; j < NUMBER[num][i].length; j++){
                    if(index+j >= m){
                        flag = false;
                        break;
                    }
                    if(map[i][index+j] != NUMBER[num][i][j]){
                        flag = false;
                    }
                }
                if(!flag){
                    break;
                }
            }
            if(flag){
                return num;
            }
        }
        return -1;
    }

    private static boolean isOne(int index, char[][] map, int n, int m) {
        for(int i = 0 ; i < n ; i++){
            if(map[i][index] != BLOCK){
                return false;
            }
        }
        if(index > 0 && map[0][index-1] == BLOCK){
            return false;
        }
        if(index < m-1 && map[0][index+1] == BLOCK){
            return false;
        }
        return true;
    }


}