1. 유형
시뮬
2. 풀이
리스트를 사용해서 머리부분은 인덱스가 끝 부분이고, 꼬리는 인덱스가 0 일 때이다.
방향은 시계방향과 반시계 방향을 구분해서 결정한다.
3. 코드
package 구현.삼성역태;
import java.util.ArrayList;
import java.util.Scanner;
public class back_3190뱀 {
static int dr[] = {-1,0,1,0};
static int dc[] = {0,1,0,-1};//위 오 아래 왼
static class Pair{
int t;
char dir;
public Pair(int t, char dir) {
this.t=t;
this.dir=dir;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int map[][]= new int[n][n];
boolean visit[][] = new boolean[n][n];
for(int i=0; i<k; i++) {
int r=sc.nextInt()-1;
int c= sc.nextInt()-1;
map[r][c] = 1;
}
int l=sc.nextInt();
ArrayList<Pair> list = new ArrayList<>();
for(int i=0; i<l; i++) {
int t= sc.nextInt();
char dir = sc.next().charAt(0);
list.add(new Pair(t+1,dir));
}
int time=0;
int dir=1;
ArrayList<int []> snake = new ArrayList<>();
snake.add(new int[] {0,0});
visit[0][0]= true;
while(true){
time++;
for(int i=0;i<list.size(); i++) {
if(list.get(i).t==time) {
if(list.get(i).dir=='D') {//시계
dir = (dir+1)%4;
}else {//반시계
dir = (dir-1);
if(dir==-1) dir=3;
}
break;
}
}
int head = snake.size()-1;
int nr = snake.get(head)[0]+dr[dir];
int nc = snake.get(head)[1]+dc[dir];
if(nr<0 || nr>=n || nc<0 || nc>=n || visit[nr][nc]) break;//이탈인 경우, 몸
else if(map[nr][nc] == 1) {//사과인경우
visit[nr][nc]= true;
map[nr][nc] = 0;
}else if(map[nr][nc]==0) {
visit[nr][nc]= true;
visit[snake.get(0)[0]][snake.get(0)[1]]= false;
snake.remove(0);
}
snake.add(new int[] {nr,nc});
}
System.out.println(time);
}
}
시계 반시계
for(int i=0;i<list.size(); i++) {
if(list.get(i).t==time) {
if(list.get(i).dir=='D') {//시계
dir = (dir+1)%4;
}else {//반시계
dir = (dir-1);
if(dir==-1) dir=3;
}
break;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 - 14711] 골드4 - 타일 뒤집기( easy) (문자열) (0) | 2020.10.29 |
---|---|
[백준 - 2638] 골드4 - 치즈 (bfs) (0) | 2020.10.29 |
[백준 - 14890] 골드3 - 경사로 (0) | 2020.10.29 |
[백준 - 2800] 골드5 - 괄호 제거 (문자열) (0) | 2020.10.25 |
[백준 - 5052] 골드4 - 전화번호 목록(문자열) (0) | 2020.10.25 |