[분류]
- 구현
- 시뮬레이션
[문제링크]
[요구사항]
문제는 기둥과 보를 조건에 맞게 설치하기를 요구하고 있다.
- 기둥은 바닥 위에 있거나 보의 한쪽 끝 부분 위에 있거나, 또는 다른 기둥 위에 있어야 한다.
- 보는 한쪽 끝 부분이 기둥 위에 있거나, 또는 양쪽 끝 부분이 다른 보와 동시에 연결되어야 한다.
[풀이]
- n의 크기나 build_frame의 크기가 그리 크지 않으므로 주어진 문제를 조건에 맞게 ‘구현’하면 된다고 판단하였다.
- 기둥과 보를 각각 따로 2차원 배열로 생성하여 설치 유무를 판단할 수 있게 한다.
- 설치, 삭제 경우를 나눈다.
- 설치의 경우에서는 기둥일 때와 보 일때 각각 조건을 검사하여 설치를 진행한다.
- 삭제의 경우에는 우선 삭제하고 모든 기둥과 보가 설치조건을 만족하는지를 따져서 조건 만족 시 그대로 두고, 조건을 만족하지 않으면 다시 되돌린다.
- 모든 작업이 완료되면 순서대로 answer 배열에 넣는다.
[코드]
//baekjoon_3190_뱀
import java.io.*;
import java.util.*;
public class Main {
static final int APPLE = 2;
static final int SNAKE = 1;
static final int L = 1;
static final int R = -1;
static final int MAX = 101;
static int n, k, m;
static int map[][];
static int[] dx = {0, -1, 0, 1};
static int[] dy = {1, 0 ,-1, 0};
static int dir = 0;
static Deque<Pair> snakes = new LinkedList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
n = Integer.parseInt(s[0]);
map= new int[n][n];
s = br.readLine().split(" ");
k = Integer.parseInt(s[0]);
for(int i=0;i<k;i++){
s = br.readLine().split(" ");
int x = Integer.parseInt(s[0])-1;
int y = Integer.parseInt(s[1])-1;
map[x][y]=APPLE;
}//사과받기
s = br.readLine().split(" ");
m = Integer.parseInt(s[0]);
snakes.add(new Pair(0, 0));
map[0][0]=SNAKE;
int time = 1;
for(int i=0;i<m;i++){
s = br.readLine().split(" ");
int sec = Integer.parseInt(s[0]);
char d = s[1].charAt(0);
if(d=='L') time = move(sec, time, L);
else time = move(sec, time, R);
}
time = move(MAX, time, dir);
System.out.println(time);
}
public static int move(int sec, int time, int direction){
int i;
for(i=time;i<=sec;i++){
Pair head = snakes.peek();
int nx = head.x+dx[dir];
int ny = head.y+dy[dir];
if(!inBound(nx, ny)) return i;
if(map[nx][ny]==SNAKE) return i;
snakes.addFirst(new Pair(nx, ny));
if(map[nx][ny]!=APPLE){
Pair tail = snakes.pollLast();
map[tail.x][tail.y]=0;
}
map[nx][ny] = SNAKE;
}//sec까지
dir = (dir+direction+4)%4;
return i;
}
public static boolean inBound(int x, int y){
return x>=0 && y>=0 && x<n && y<n;
}
public static class Pair{
int x;
int y;
public Pair(int x, int y){
this.x = x;
this.y = y;
}
}
}
[통과여부]
[느낀점]
골드5라서 할만했지만 난이도가 어려워지면 구현이 더 오래걸릴 것 같다.