(백준) 뱀 _ 3190

2021. 10. 22. 14:04·알고리즘/백준

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

 

🐢 설명

2차원 맵을 뱀이 돌아다닌다. 이때 뱀이 자신의 몸에 닿거나 or 벽을 넘어가면 종료된다.

  • 맵에 있는 사과를 먹으면 몸의 길이가 1 늘어난다.
  • 그렇지 않으면 앞으로 계속 간다.
  • 특정 초에 이동을 완료하고 방향만 바꾸는 명령이 주어진다.

사과를 안먹은 경우에는 이동 후 꼬리를 땡겨야 하는데 이를 위해서 뱀의 이동 내역을 담기 위한 Deque을 사용했다. 이동할 때 다음 위치의 유효성 검사를 하고 유효한 경우 사과 여부에 따라 구분하여 처리한다. 사과가 없다면 덱의 마지막을 뽑아서 제거하고, 있다면 다음 좌표를 덱의 앞에 넣어준다. 이동이 끝나면 명령의 시간과 현재 시간을 비교해서 같다면 왼쪽 / 오른쪽으로 방향만 바꿔준다.

 

조심할 점

  • 초기 Deque에 처음 좌표 (0, 0)을 넣어줘야 한다.
  • 사과가 놓이는 좌표는 (1, 1) 기준이므로 조정해줘야 한다.
  • 13초에 이동하다가 벽을 넘거나 몸에 닿으면 게임은 13초에 끝난거다.
  • 다음 좌표의 유효성이 체크되었다면 머리 좌표를 이동시켜야 한다.
🐢코드
package Gold이상문제_정리;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class 뱀_3190 {
    static final int right = 0, up = 1, left = 2, down = 3;
    static int[] dy = {0, -1, 0, 1};
    static int[] dx = {1, 0, -1, 0};
    static final int A = 1;
    static final int BODY = 2;
    static int N;
    static int[][] map;
    static int appleCount;
    static int cmdCount;
    static int T = 0;
    static Snake snake;
    static Queue<CMD> cmds = new LinkedList<>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        appleCount = Integer.parseInt(br.readLine());
        map = new int[N][N];

        for (int i = 0; i < appleCount; i++) {
            String[] pos = br.readLine().split(" ");
            int y = Integer.parseInt(pos[0]) - 1;
            int x = Integer.parseInt(pos[1]) - 1;
            map[y][x] = A;
        }

        cmdCount = Integer.parseInt(br.readLine());
        for (int i = 0; i < cmdCount; i++) {
            String[] cmd = br.readLine().split(" ");
            int time = Integer.parseInt(cmd[0]);
            String command = cmd[1];
            cmds.add(new CMD(time, command));
        }

        solve();
        System.out.println(T);
    }

    private static void solve() {
        LinkedList<Dot> body = new LinkedList<>();
        body.add(new Dot(0, 0));
        snake = new Snake(right, new Dot(0, 0), body);
        map[0][0] = BODY;

        while (true) {
            T++;
            if (!move()) return;
            // turn
            if (!cmds.isEmpty() && T == cmds.peek().time) {
                turn(cmds.poll().command);
            }
        }
    }

    private static void turn(String command) {
        if (command.equals("L")) {
            snake.dir = ++snake.dir % 4;
        } else {
            if (snake.dir == right) snake.dir = down;
            else snake.dir--;
        }
    }

    private static boolean move() {
        Dot now = snake.head;
        int dir = snake.dir;
        int ny = now.y + dy[dir];
        int nx = now.x + dx[dir];

        // 벽 || 몸통
        if (ny < 0 || nx < 0 || ny >= N || nx >= N) return false;
        if (map[ny][nx] == BODY) return false;

        // apple
        if (map[ny][nx] == A) {
            map[ny][nx] = BODY;
            snake.body.addFirst(new Dot(ny, nx));
        }// no apple
        else {
            map[ny][nx] = BODY;
            snake.body.addFirst(new Dot(ny, nx));
            if (snake.body.size() > 0) {
                Dot tail = snake.body.pollLast();
                map[tail.y][tail.x] = 0;
            }
        }
        snake.head.y = ny;
        snake.head.x = nx;
        return true;
    }

    private static class CMD {
        int time;
        String command;

        public CMD(int time, String command) {
            this.time = time;
            this.command = command;
        }
    }

    private static class Snake {
        int dir;
        Dot head;
        Deque<Dot> body;

        public Snake(int dir, Dot head, Deque<Dot> body) {
            this.dir = dir;
            this.head = head;
            this.body = body;
        }
    }

    private static class Dot {
        int y, x;

        public Dot(int y, int x) {
            this.y = y;
            this.x = x;
        }
    }
}
🐢 마무리
반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

(백준) 로봇 시물레이션 _ 2174  (3) 2021.12.10
(백준) 불 _ 5427  (0) 2021.12.08
(백준) 마법사 상어와 파이어스톰  (0) 2021.10.19
(백준) 마법사 상어와 토네이도  (0) 2021.10.19
(백준) 독서실 거리두기 _ 20665  (0) 2021.10.10
'알고리즘/백준' 카테고리의 다른 글
  • (백준) 로봇 시물레이션 _ 2174
  • (백준) 불 _ 5427
  • (백준) 마법사 상어와 파이어스톰
  • (백준) 마법사 상어와 토네이도
구름뭉치
구름뭉치
구름의 개발일기장
    반응형
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (287)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (3)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (7)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    마우스
    레이저
    동유럽
    류블라냐
    mx master s3 for mac
    마우스 패드
    키보드 손목 받침대
    크로아티아
    부다페스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
(백준) 뱀 _ 3190
상단으로

티스토리툴바