알고리즘

백준 14500번 테트로미노 (JAVA)

박카스마시며코딩 2022. 3. 22. 17:33

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

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

 

저는 해당 문제를 DFS를 이용해 문제를 해결하였습니다. 

'ㅜ' 모양을 제외하면 사실 DFS로 depth 4까지 가게된다면 회전 , 대칭을 모두 체크할 수 있기 때문에 DFS를 이용하였습니다.

'ㅜ' 모양은 이차원 배열을 통해 있는 3X2배열로 있는 칸은 1 없는 칸은 0 으로 하여 해당 배열과 주어진 배열의 각각 요소의 곱의 합으로 하였습니다.

또한, 'ㅜ' 은 한 바퀴 돌리면 대칭인 것들을 모두 포함하기 때문에 'ㅜ'을 한바퀴 돌리면서 요소의 곱의 합을 구하였습니다.

 

package BOJ.Simulation;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_3190 {
    private static class Node{
        int time;
        char dir;

        public Node(int time, char dir) {
            this.time = time;
            this.dir = dir;
        }
    }
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        Function<String,Integer> stoi = Integer::parseInt;
        int n  =  stoi.apply(br.readLine());
        int k = stoi.apply(br.readLine());
        int[][] map = new int[n][n];
        for(int i = 0 ; i < k ; i++){
            st = new StringTokenizer(br.readLine());
            int y = stoi.apply(st.nextToken());
            int x = stoi.apply(st.nextToken());
            map[y-1][x-1] = 9;
        }
        int m = stoi.apply(br.readLine());
        Node[] input = new Node[m];
        for(int i = 0 ; i < m ; i++){
            st = new StringTokenizer(br.readLine());
            int y = stoi.apply(st.nextToken());
            char x = st.nextToken().charAt(0);
            input[i] = new Node(y,x);
        }
        System.out.println(move(map,input,n,m));
    }
    private static final int[] dy = {-1,0,1,0}; // 시작 dir = 1
    private static final int[] dx = {0,1,0,-1};
    private static void print(int[][] arr, int n ){
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < n ; j++){
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println();
    }
    private static int move(int[][] map , Node[]input,int n,int m){
        int time = 1;
        int ny = 0;
        int nx = 0;
        int dir = 1;
        int moveIndex = 0;
        map[ny][nx] = 1;
        Queue<int[]> prev = new LinkedList<>();
        prev.offer(new int[] {0,0});
        while(true){
//            print(map,n);
            ny += dy[dir];
            nx += dx[dir];
//            System.out.println(time+" "+ny+" "+nx+" "+dir);
            if(nx < 0 || nx >= n || ny < 0 || ny >= n){
                break;
            }
            if(map[ny][nx] == 1){
                break;
//                int[] lastPrev = prev.poll();
//                if(!(ny == lastPrev[0] && nx == lastPrev[1])){
//                    break;
//                }
//                prev.add(new int[] {ny,nx});
//                map[lastPrev[0]][lastPrev[1]] = 0;
            } else if(map[ny][nx] == 9){
                map[ny][nx] = 1;
                prev.add(new int[] {ny,nx});
            } else if(map[ny][nx] == 0){
                map[ny][nx] = 1;
                int[] lastPrev = prev.poll();
                map[lastPrev[0]][lastPrev[1]] = 0;
                prev.add(new int[] {ny,nx});
            }
            if(moveIndex < m && input[moveIndex].time == time){
                if(input[moveIndex].dir == 'L'){
                    dir += 3;
                }
                if(input[moveIndex].dir == 'D'){
                    dir += 1;
                }
                dir %= 4;
                moveIndex++;
            }
            time++;
        }
        return time;
    }
}

'알고리즘' 카테고리의 다른 글

백준 14891번 톱니바퀴 (JAVA)  (0) 2022.03.24
백준 14502번 연구소 (JAVA)  (0) 2022.03.23
백준 12100번 2048 (JAVA)  (0) 2022.03.21
백준 13460번 구슬 탈출2 (JAVA)  (0) 2022.03.20
백준 1944번 복제 로봇 (JAVA)  (0) 2022.03.19