ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준][자바][9205]맥주 마시면서 걸어가기
    코딩/알고리즘 2019. 10. 2. 17:21

    맥주 마시면서 걸어가기 

    이 문제를 잘 생각해보면 거리가 20병이 최대고 그러면 이동할수 있는 거리가 최대 1000이라는 이야기가 된다

    그에 따라 편의점에 갈수 있는지 없는지를 분기처리해서 q에 넣고 빼면 된다. 

    package back;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    class MPoint{
    	int y;
    	int x;
    	MPoint(int y, int x) {
    		this.y = y;
    		this.x = x; 
    	}
    }
    public class Main_backjoon_9205_맥주마시면서걸어가기 {
    	static int TESTCASE;
    	static int N;
    	static int startX;
    	static int startY;
    	static int endX;
    	static int endY;
    	static Queue q = new LinkedList();
    	static LinkedList pq =  new LinkedList();
    	public static void main(String[] args) throws IOException {	
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(br.readLine(), "");
    		TESTCASE = Integer.parseInt(st.nextToken());
    		for(int T= 0 ; T < TESTCASE; T++) {
    			q = new LinkedList();
    			pq = new LinkedList();
    			st = new StringTokenizer(br.readLine(), "");
    			N = Integer.parseInt(st.nextToken());
    			st = new StringTokenizer(br.readLine(), " ");
    			//상근이 집 
    			startY = Integer.parseInt(st.nextToken());
    			startX = Integer.parseInt(st.nextToken());
    			q.add(new MPoint(startY, startX));
    			//편의점 
    			for(int i = 0 ; i < N; i++){
    				st = new StringTokenizer(br.readLine(), " ");
    				int y = Integer.parseInt(st.nextToken());
    				int x = Integer.parseInt(st.nextToken());
    				pq.add(new MPoint(y,x));
    				
    			}
    			st = new StringTokenizer(br.readLine(), " ");
    			endY = Integer.parseInt(st.nextToken());
    			endX = Integer.parseInt(st.nextToken());
    			solve();
    		}
    	}
    	
    	public static void solve() {
    		while(!q.isEmpty()) {
    			MPoint mp = q.poll();
    			int yy = mp.y;
    			int xx = mp.x;
    			int distance = getDistance(endY, yy, endX, xx );
    			//System.out.println("distance " + distance);
    			if( distance > 1000) { //아직 distance가 1000보다 크다면 
    				int pqSize = pq.size();
    				for(int s = 0; s < pqSize; s++ ) { //편의점 LOOP
    					MPoint tp = pq.poll();
    					int pyy = tp.y; 
    					int pxx = tp.x;
    					int newDistance = getDistance(yy, pyy, xx, pxx );
    					if(newDistance <= 1000) { //1000보다 작은 친구들 q.add();
    						q.add(new MPoint(pyy, pxx));
    						
    					}else { //
    						pq.add(tp);
    					}
    				}
    			}else { // solve
    				System.out.println("happy");
    				return;
    			}
    		}
    		System.out.println("sad");
    		
    	}
    	public static Integer getDistance(int p1, int q1, int p2, int q2){
    		return Math.abs(p1 -q1) + Math.abs(p2 - q2);
    	}
    }
    
    

    댓글

Designed by Tistory.