Skip to content

Latest commit

 

History

History
201 lines (171 loc) · 5.61 KB

1회차_2022.04.13_뱀.md

File metadata and controls

201 lines (171 loc) · 5.61 KB

image

강지웅

서예진

오나연

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main_BOJ_3190_뱀_0412 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int N = Integer.parseInt(br.readLine());
		int[][] map = new int[N][N];
		// 뱀은 1
		map[0][0] = 1;
		
		int K = Integer.parseInt(br.readLine());
		for(int i=0; i<K; i++) {
			st = new StringTokenizer(br.readLine());
			// 사과는 2
			map[Integer.parseInt(st.nextToken())-1][Integer.parseInt(st.nextToken())-1] = 2;
		}
		
		// 방향 전환 정보
		Queue<String[]> dirs = new LinkedList<>();
		int L = Integer.parseInt(br.readLine());
		for(int i=0; i<L; i++) {
			st = new StringTokenizer(br.readLine());
			dirs.offer(new String[] {st.nextToken(), st.nextToken()});
		}		
		System.out.println(move(map, N, dirs));
	}
	
	// 이동
	public static int move(int[][] map, int N, Queue<String[]> dirs) {
		// 우 하 좌 상
		int[] dx = {0, 1, 0, -1};
		int[] dy = {1, 0, -1, 0};
		
		// 뱀의 위치 들어있는 큐
		Queue<int[]> snake = new LinkedList<>();
		// 항상 0,0에 머리 위치
		snake.offer(new int[] {0,0});
		// 처음 방향은 항상 오른쪽
		int x = 0, y = 0, d = 0, time = 0;
		// 방향 전환 정보에서 다음 움직일 시간과 방향 가져옴
		String[] nextDir = dirs.poll();
		int nextT = Integer.parseInt(nextDir[0]);
		char nextD = nextDir[1].charAt(0);
		
		while(true) {
			// 움직일 시간이 되면
			if(nextT == time) {
				if(nextD == 'D') d++; // D면 오른쪽
				if(nextD == 'L') d--; // L이면 왼쪽
				if(d == 4) d = 0; // 인덱스 넘어가면 처음인덱스로
				else if(d == -1) d = 3; // 인덱스 넘어가면 마지막 인덱스로
				
				// 다음에 움직일 정보 가져옴
				if(!dirs.isEmpty()) {
					nextDir = dirs.poll();
					nextT = Integer.parseInt(nextDir[0]);
					nextD = nextDir[1].charAt(0);
				}
			}
			// 움직이고 시간++
			x += dx[d];
			y += dy[d];
			time++;
			
			// 범위 벗어나면 끝
			if(x<0 || x>=N || y<0 || y>=N) break;
			// 뱀의 몸과 부딪히면 끝
			if(map[x][y] == 1) break;
			
			// 사과가 아닐 때는 꼬리 제거 (사과일 때는 꼬리 유지)
			if(map[x][y] != 2) {
				int[] tail = snake.poll();
				map[tail[0]][tail[1]] = 0;
			}
			
			// 이동
			snake.offer(new int[] {x, y});
			map[x][y] = 1;
		}
		return time;
	}
}

이주형

정윤영

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BOJ_3190 {

    static int N, K, L;
    static Queue<Turn> queue;
    static int[][] arr;
    static Queue<int[]> snakeQ;
    static int[][] deltas = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};     //뱀은 처음에 오른쪽을 향함
    static int cnt;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());        //보드의 크기
        arr = new int[N][N];        //뱀 몸둥이 -1, 사과 2
        K = Integer.parseInt(br.readLine());        //사과의 개수
        for (int i = 0; i < K; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int r = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            arr[r - 1][c - 1] = 2;      //1행1열부터 시작
        }
        L = Integer.parseInt(br.readLine());        //방향 전환 횟수
        queue = new LinkedList<>();
        for (int i = 0; i < L; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            queue.add(new Turn(Integer.parseInt(st.nextToken()), st.nextToken().charAt(0)));
        }

        snakeQ = new LinkedList<>();
        snakeQ.add(new int[]{0, 0});
        arr[0][0] = -1;
        snake(0, 0, 0);
        System.out.println(cnt);
    }

    public static void snake(int r, int c, int direct) {
        cnt++;
        int dr = r + deltas[direct][0];
        int dc = c + deltas[direct][1];
        if (isAvailable(dr, dc)) {      //arr[dr][dc] == -1 걸러줌
            if (arr[dr][dc] != 2) {       //사과X
                int[] tail = snakeQ.poll();
                arr[tail[0]][tail[1]] = 0;
            }
            snakeQ.add(new int[]{dr, dc});
            arr[dr][dc] = -1;
            if (!queue.isEmpty() && queue.peek().time == cnt) {        //방향전환
                Turn t = queue.poll();
                if (t.dir == 'L') {
                    direct = (direct - 1) < 0 ? 3 : (direct - 1);
                } else {
                    direct = (direct + 1) % 4;
                }
            }
            snake(dr, dc, direct);
        }
    }

    public static boolean isAvailable(int dr, int dc) {
        return dr >= 0 && dc >= 0 && dr < N && dc < N && arr[dr][dc] != -1;
    }

    //시간이 증가하는 순서로 주어짐
    public static class Turn {
        int time;
        int dir;

        Turn(int time, int dir) {
            this.time = time;
            this.dir = dir;
        }
    }
}