재채기는 H

백준 3190 - 뱀 JAVA 본문

알고리즘

백준 3190 - 뱀 JAVA

에취~H 2020. 7. 17. 14:00
반응형

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

 

3190번: 뱀

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

www.acmicpc.net

단순 시뮬레이션문제 였던거같다.

내가 필요로 하는

x,y 쌍의 Pair 클래스와,

초마다의 방향을 알려주는 Dic 클래스,

그리고 뱀을 이동과 시간, 방향을 알려주는 Snake 클래스를 생성하였다.

 

사과는 이차원 배열인 map에 있을 때 1, 없을 때 0을 주어 표현하였고

뱀이 이동하는 것은 snake객체에 list와 map에서는 2로 표현해주었다.

딱히 문제없이 풀 수 있는 난이도였다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

class Pair{
	int x;
	int y;
	Pair(int x, int y){
		this.x=x;
		this.y=y;
	}
}
class Dic{
	int sec;
	String dic;
	Dic(int sec, String dic){
		this.sec=sec;
		this.dic=dic;
	}
}

class Snake{
	List<Pair> list;
	int dic;
	int cnt;
	
	Snake(List<Pair> list, int dic, int cnt){
		this.list= list;
		this.dic= dic;
		this.cnt = cnt;
	}
}
public class 백준_뱀_3190 {
	static int N,K,L;
	static int[][] map;
	static Queue<Dic> changeDic;
	static Snake snake;
	//북 동 남 서
	static int[] dx = {-1,0,1,0};
	static int[] dy = {0,1,0,-1};
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		N = Integer.parseInt(br.readLine());
		map = new int[N][N];
		
		K = Integer.parseInt(br.readLine());
		for(int i=0;i<K;i++) {
			st = new StringTokenizer(br.readLine());
			map[Integer.parseInt(st.nextToken())-1][Integer.parseInt(st.nextToken())-1]=1;
		}
		map[0][0]=2;
		
		L = Integer.parseInt(br.readLine());
		changeDic = new LinkedList<>();
		for(int i=0;i<L;i++) {
			st = new StringTokenizer(br.readLine());
			changeDic.add(new Dic(Integer.parseInt(st.nextToken()), st.nextToken()));
		}
		
		List<Pair> list = new ArrayList<>();
		list.add(new Pair(0,0));
		snake = new Snake(list, 1, 0);
		
		move();
		System.out.println(snake.cnt);
	}

	static void move() {
		while(true) {
//			System.out.println(snake.cnt);
//			for(int i=0;i<N;i++) {
//				for(int j=0;j<N;j++) {
//					System.out.print(map[i][j]+" ");
//				}
//				System.out.println();
//			}
			int x = snake.list.get(snake.list.size()-1).x + dx[snake.dic];
			int y = snake.list.get(snake.list.size()-1).y + dy[snake.dic];
			
			snake.cnt++;
			if(0<=x&&x<N&&0<=y&&y<N) {
				if(map[x][y]==1) {
					snake.list.add(new Pair(x,y));
					map[x][y]=2;
				}else if(map[x][y]==0){
					Pair p =snake.list.remove(0);
					map[p.x][p.y]=0;
					snake.list.add(new Pair(x,y));
					map[x][y]=2;
				}else if(map[x][y]==2) {
					break;
				}
				
				if(!changeDic.isEmpty()&&snake.cnt==changeDic.peek().sec) {
//					System.out.println("changeDic.peek().sec : "+changeDic.peek().sec);
					String dic =changeDic.poll().dic;
//					System.out.println("dic : "+dic);
					if(dic.equals("L")) {
						snake.dic-=1;
						if(snake.dic==-1) {
							snake.dic=3;
						}
					}else if(dic.equals("D")){
						snake.dic+=1;
						if(snake.dic==4) {
							snake.dic=0;
						}
					}
				}
			}else {
				break;
			}
		}
	}
}
반응형

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

백준 14499 - 주사위 굴리기 JAVA  (0) 2020.07.21
백준 12100 - 2048 (Easy) JAVA  (0) 2020.07.20
백준 13458 - 시험 감독 JAVA  (0) 2020.07.20
백준 13460 - 구슬 탈출 2 JAVA  (0) 2020.07.16
백준 1790 - 수 이어 쓰기 2 JAVA  (0) 2020.07.14
Comments