ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 3190 뱀 #JAVA #시뮬레이션
    Algorithm Solving/BAEKJOON 2021. 12. 17. 13:33

    [백준] 3190 뱀 #JAVA #시뮬레이션

     


    코드


    import java.io.*;
    import java.util.*;
    public class Main {
    
    	public static void main(String[] args) throws IOException{
    
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		
    		int N = Integer.parseInt(br.readLine());//보드 크기
    		int K = Integer.parseInt(br.readLine());//사과 개수
    		
    		int[][] board = new int[N][N];
    		
    		StringTokenizer st;
    		
    		for (int i = 0; i < K; i++) { //사과 자리
    			st = new StringTokenizer(br.readLine());
    			int y = Integer.parseInt(st.nextToken());
    			int x = Integer.parseInt(st.nextToken());
    			
    			board[y-1][x-1] = 1;
    			
    		}
    		
    		Deque<int[]> snake = new LinkedList<>();
    		snake.addFirst(new int[] {0,0});
    		int snakeHead = 0; //0동 1남 2서 3북
    		
    		int L = Integer.parseInt(br.readLine());//방향 전환
    		int[] dir = new int[10001];
    		
    		for (int i = 0; i < L; i++) {
    			st = new StringTokenizer(br.readLine());
    			int sec = Integer.parseInt(st.nextToken());
    			String d = st.nextToken();
    			
    			if(d.equals("L")) dir[sec] = -1;
    			else if(d.equals("D")) dir[sec] = 1;
    			
    		}
    		
    		int second = 0;
    		while (true) {
    			second++;
    			
    			int[] head =snake.peekFirst();
    			
    			int ny = head[0];
    			int nx = head[1];
    			if(snakeHead == 0) {//동
    				nx += 1;
    			} else if(snakeHead == 1) {//남
    				ny += 1;
    			} else if(snakeHead == 2) {//서
    				nx -= 1; 
    			} else if(snakeHead == 3) {//북
    				ny -= 1;
    			}
    			
    			//벽 부딪힘 check
    			if(nx<0 || ny<0 || nx >=N || ny>=N) break;
    			
    			//몸통 부딪힘 check
    			Iterator<int[]> iter= snake.iterator();
    			boolean isBody = false;
    			while (iter.hasNext()) {
    				int[] tmp = iter.next();
    				if(ny == tmp[0] && nx == tmp[1]) {
    					isBody = true;
    					break;
    				}
    			}
    			if(isBody)break;
    			
    
    			snake.addFirst(new int[] {ny,nx});//머리 이동
    			if(board[ny][nx] == 1) {
    				board[ny][nx] = 0; //사과 삭제
    			}else {
    				snake.removeLast();//사과 안먹었으면 꼬리 이동
    			}			
    			
    			if(dir[second] != 0) {
    				snakeHead += dir[second];
    				if(snakeHead<0) snakeHead += 4;
    				snakeHead %= 4;
    			}
    			
    		}
    		
    		System.out.println(second);
    	}
    
    }

     

     

    풀이


    • Dequeue에 뱀의 좌표를 머리 ~ 꼬리 순으로 넣는다.
    • 뱀의 머리가 4방향중 어디인지 정의한다.
    • 이동할 떄마다 배열 범위를 벗어나는지 체크하고, 뱀 몸통에 부딪히는지 체크한다.
    • 뱀이 사과를 먹으면 몸이 길어지고, 사과는 삭제한다.

     

    주의 사항


    • 뱀의 머리가 범위를 벗어나는 것을 체크해야 한다. (0~3 범위)
    • 뱀이 사과를 먹고나서 사과를 삭제해야한다.

     

    반례


    아래 반례가 되지 않는다면 사과처리에 대해 다시 확인해 본다.

    #INPUT
    35
    28
    21 2
    22 23
    3 5
    34 30
    29 31
    3 28
    20 12
    27 26
    31 7
    5 10
    21 10
    19 2
    15 23
    4 23
    3 19
    3 35
    13 30
    30 30
    23 27
    32 17
    22 24
    8 27
    4 8
    30 18
    15 28
    22 29
    28 5
    16 33
    20
    27 D
    61 L
    68 L
    100 L
    133 L
    160 L
    165 D
    168 D
    170 D
    182 D
    206 D
    207 D
    214 D
    215 D
    216 L
    237 D
    240 D
    241 L
    251 D
    252 D
    
    #OUTPUT
    237

     

     

     


    잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)

     

     

     

    댓글