백준 3190 뱀

노문택·2022년 4월 5일
0
post-custom-banner

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

내생각에는 큐 자체로는 잘 안나오고 시뮬레이션이랑 엮여서 나오는거같다.. 높은 난이도를 풀면.. 시뮬레이션공부도 함께될듯..ㅠ

여기의 핵심은 문제에서 그대로 내줫다

  1. 뱀을 늘려 머리칸에위치
  2. 사과있으면 꼬리x
  3. 사과있으면 꼬리줄여주세요

그러면 여기서 질문이 생김

엥 ? 혹시 엣지케이스의 경우에 사과머리와 꼬리위치에 경우 어케처리해야되죠..

라는 걸 생각할수있는데 애초에 꼬리가있다는건 그자리를 지나침 => 사과를 이미먹음 이므로 고려할필요가없다

그리고 그걸 문제에서 힌트를 줫다,.

그래서 맘놓고 구현하면된다..

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

public class 뱀 {

	static class snake{
		int x;
		int y;
		public snake(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}
	static class command {
		int x;
		int type;
		public command(int x, int type) {
			this.x = x;
			this.type = type;
		}

	}
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int K = Integer.parseInt(br.readLine());
		
		boolean[][] apple = new boolean[N+1][N+1];
		boolean[][] snake = new boolean[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());
			apple[X][Y] =true;
		}
		int L = Integer.parseInt(br.readLine());
		
		Queue<snake> sq = new LinkedList<>();
		
		Queue<command> cq= new LinkedList<>(); 
		
		for(int i=0;i<L;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int X = Integer.parseInt(st.nextToken());
			String k = st.nextToken();
			int T=-1;
			if(k.equals("D")) T=1;
			cq.add(new command(X,T));
		}
		
		sq.add(new snake(1,1));
		snake[1][1] = true;
		int nowd = 1;
		int nowx=1;
		int nowy=1;
		int time = 0;
		int dx[] = new int[] {-1,0,1,0 };
		int dy[] = new int[] {0,1,0,-1};
		while(true) {
			time++; //

			int newx = nowx + dx[nowd];
			int newy = nowy + dy[nowd];
			
			//벽에 부딪힘체크
			if(newx==0 || newy ==0 || newx == N+1 || newy ==N+1) break;
			//자기 몸에 부딪혔을까요 ?
			if(snake[newx][newy]) break;
			//사과 못먹기
			if(!apple[newx][newy]) {
				snake tail = sq.poll();
				snake[tail.x][tail.y] =false;
			}
			else {
				apple[newx][newy] = false;
			}
			snake[newx][newy] = true;
			sq.add(new snake(newx,newy));
			if(!cq.isEmpty()&&cq.peek().x==time) nowd += cq.poll().type;
			if(nowd<0) nowd+=4;
			if(nowd>3) nowd%=4;
			nowx = newx;
			nowy = newy;
		}
		
		System.out.println(time);
	}

}

문제를 꼼꼼히 안읽어서 다시푸는건데도 많이 틀렷다..

골4 큐문제는없으므로 골3으로 드가자 ㄷㄱㅈㄷㄱㅈㄷㄱㅈㄷㄱ

profile
노력하는 뚠뚠이
post-custom-banner

0개의 댓글