백준 - 뱀 - Java

chaemin·2024년 3월 20일
0

백준

목록 보기
9/26

1. 문제

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

이 문제는 단순 구현으로 푸는 문제이다.
그래서인지 좀 더 어렵게 느껴질 수 있다.

2. ✨핵심 Point

  1. Deque를 사용해서 머리좌표와 꼬리좌표를 빼내고 넣는다.
  1. moveX, moveY의 좌표설정이 중요하다.
  • 90도씩 돌아가니까 시계방향으로 오른쪽, 아래, 왼쪽, 위
  • 따라서 오른쪽: 0, 아래: 1, 왼쪽: 2, 위: 3
static int[] moveX = {0, 1, 0, -1};
static int[] moveY = {1, 0, -1, 0};
  1. 갈려는 좌표(goX, goY)가 사과인지 먼저 파악하고 머리좌표를 Deque에 넣어준다.
if(map[goX][goY] != 2){ // 사과가 아니면
	// 꼬리를 빼준다.
	int tailX = dqX.poll();
	int tailY = dqY.poll();
    map[tailX][tailY] = 0;
}
// 머리는 항상 가니까 넣어준다.
dqX.add(goX);
dqY.add(goY);
map[goX][goY] = 1;

3. 코드

import java.util.*;
import java.io.*;

public class Main{
    
    // 90도씩 돌아가니까 시계방향으로 오른쪽, 아래, 왼쪽, 위
    // 따라서 오른쪽: 0, 아래: 1, ....
    static int[] moveX = {0, 1, 0, -1};
    static int[] moveY = {1, 0, -1, 0};
    
    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[][] map = new int[N+1][N+1];
        
        for(int i = 0; i < K; i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            map[x][y] = 2; // 2: 사과
        }
        
        ArrayList<Direction> dirList = new ArrayList<>();
        
        int L = Integer.parseInt(br.readLine());
        for(int i = 0; i < L; i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int X = Integer.parseInt(st.nextToken());
            String C = st.nextToken();
            
            dirList.add(new Direction(X, C));
        }
        
        Deque<Integer> dqX = new ArrayDeque<Integer>();
        Deque<Integer> dqY = new ArrayDeque<Integer>();
        int time = 0;
        int direction = 0; //오른쪽 먼저
        
        dqX.add(1);
        dqY.add(1);
        map[1][1] = 1; // 1: 뱀
        
        //while(!dqX.isEmpty()){
        while(true){
            
            time++;
            
            // peekLast: Queue에서 맨 나중에 들어간 원소. = 머리부분
            int goX = (int)dqX.peekLast() + moveX[direction];
            int goY = (int)dqY.peekLast() + moveY[direction];
            
            // 범위에 벗어나거나, 뱀이 있는 위치라면(map[][] == 1)
            if(goX <= 0 || goY <= 0 || goX > N || goY > N || map[goX][goY] == 1){
                break;
            }
            
            if(map[goX][goY] != 2){ // 사과가 아니면
            	// 꼬리를 빼준다.
                int tailX = dqX.poll();
                int tailY = dqY.poll();
                
                map[tailX][tailY] = 0;
            }
            
            // 머리는 항상 가니까 넣어준다.
            dqX.add(goX);
            dqY.add(goY);
            map[goX][goY] = 1;
            
            if(!dirList.isEmpty()){
                if(time == dirList.get(0).time){
                    String dirS = dirList.get(0).dir;
                    
                    dirList.remove(0);
                    
                    if(dirS.equals("D")){
                        direction += 1;
                        if(direction > 3){
                            direction = 0;
                        }
                    } else {
                        direction -= 1;
                        if(direction < 0){
                            direction = 3;
                        }
                    }
                }
            }
        }
        System.out.println(time);
    }
    
    public static class Direction{
        int time;
        String dir;
        
        public Direction(int time, String dir){
            this.time = time;
            this.dir = dir;
        }
    }
}

0개의 댓글

관련 채용 정보