알고리즘
백준 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;
}
}