알고리즘/BOJ

[BJ]BJ G5 3190 뱀

  • -

BJ G5 3190 뱀

 

 

문제링크

3190번: 뱀 (acmicpc.net)

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

* 일단 문제를 정독 하고 1시간 이상 반드시 고민이 필요합니다.

 

동영상 설명

1시간 이상 고민 했지만 아이디어가 떠오르지 않는다면 동영상에서 약간의 힌트를 얻어봅시다.

 

소스보기

동영상 설명을 보고도 전혀 구현이 안된다면 연습 부족입니다.
소스를 보고 작성해 본 후 스스로 백지 상태에서 3번 작성해 볼 의지가 있다면 소스를 살짝 보세요.

더보기
package bj.gold.l5;

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

/**
 * @author 은서파
 * @since 2021. 10. 10.
 * @see  https://www.acmicpc.net/problem/3190
 * @performance 12324	84	
 * @category #시뮬레이션, #큐
 * @memo
 * 방향회전을 고려하여 deltas 작성
 */

public class BJ_G5_3190_뱀 {

	static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder output = new StringBuilder();
	static StringTokenizer tokens;
	
	static int N, K;
	static int [][] map;
	static int L;
	// 시계 방향으로 회전해야 하므로 북>동>남>서의 순서로 작성!
	static int [][] deltas = {{-1, 0},{0, 1},{1, 0},{0, -1}};
	
	public static void main(String[] args) throws IOException {
		input = new BufferedReader(new StringReader(src));
		N = Integer.parseInt(input.readLine());// 보드의 크기
		K = Integer.parseInt(input.readLine());// 사과의 개수
		map = new int[N+1][N+1];
		for(int k=0; k<K; k++) {
			tokens = new StringTokenizer(input.readLine());
			int r = Integer.parseInt(tokens.nextToken());
			int c = Integer.parseInt(tokens.nextToken());
			map[r][c]=1;
		}// 사과 처리
		
		L = Integer.parseInt(input.readLine());// 회전 정보
		int x=0;
		String c="";
		
		Snake s = new Snake();
		int time = 0;
		for(int l=0; l<=L; l++) {
			if(l<L) { // 입력으로 들어오는것 처리
				tokens = new StringTokenizer(input.readLine());
				x = Integer.parseInt(tokens.nextToken());
				c = tokens.nextToken();
			}else {// 입력 이후의 동작 처리
				x = Integer.MAX_VALUE;
			}
			
			// x초만큼 이동
			while(time<x) {
				boolean result = s.move();
				time++;
				if(!result) {
					System.out.println(time);
					return;
				}
			}
			
			// c방향으로 회전
			s.turn(c);
		}
	}
	static class Snake extends LinkedList<Point>{
		
		public Snake() {
			// 1,1에서 출발하고 방향은 오른쪽!!
			addHead(new Point(1, 1));
			d = 1;
		}
		
		int d;
		// 새로운 헤드 추가
		public void addHead(Point head) {
			this.offer(head);
			map[head.r][head.c]=-1;
		}
		// 이동 - 벽을 만나거나 뱀뱀이를 만나면 끝
		// 이동의 주체-head, (마지막에 추가된 녀석)
		public boolean move() {
			int nr = this.getLast().r + deltas[d][0];
			int nc = this.getLast().c + deltas[d][1];
			
			// 이동 가능? 영역 내부이면서 뱀이 아닌 지점 (-1이 아닌 지점)
			if(1<=nr && nr<=N && 1<=nc && nc<=N && map[nr][nc]!=-1) {
				// 이동하려는 지점이 사과가 아니라면?
				if(map[nr][nc]==0) { // 꼬리(맨 처음에 추가된 요소)가 이동 - 감소
					Point tail = this.poll();
					map[tail.r][tail.c]=0;
				}
				// 이동 지점 처리
				addHead(new Point(nr, nc));				
				return true;
			}else {
				return false;
			}
		}
		
		
		// 방향전환
		public void turn(String c) {
			if(c.equals("D")) {
				d = (d+1)%4;
			}else {
				d = (d+3)%4;
			}
		}
	}
	
	
	
	static class Point{
		int r, c;
		public Point(int r, int c) {
			this.r = r;
			this.c = c;
		}
	}

	// REMOVE_START
    private static String src = "5\r\n" +
            "2\r\n" +
            "2 5\r\n" +
            "2 4\r\n" +
            "6\r\n" +
            "4 D\r\n" +
            "5 D\r\n" +
            "6 D\r\n" +
            "7 D\r\n" +
            "8 D\r\n" +
            "9 D";
	// REMOVE_END

}

 

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

[BJ]14501 퇴사  (0) 2021.10.20
[BJ]백준 14499 주사위굴리기  (0) 2021.10.15
[BJ]BJ G2 12100 2048(Easy)  (0) 2021.10.04
[BJ]BJ_G2_13460_구슬탈출2  (0) 2021.09.26
[BJ]1520 내리막길  (0) 2021.09.23
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.