BOJ8972 미친 아두이노(Java)

Mieulchi·2026년 1월 29일

algorithm

목록 보기
7/33

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

풀이 방법 : 구현, 시뮬레이션

사고 과정

그냥 시뮬레이션

1~9 방향으로 이동하기 편하게 dr / dc 배열을 사용했다.

로봇이 겹치는 경우엔 배열에 좌표 넣었다가 한번 시뮬레이션마다 지워주었다.

열심히 시뮬레이션 하면 된다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;


class Main {
	static BufferedReader br;
	static StringTokenizer st;
	static StringBuilder sb;
	static int R, C;
	static char [][] arr;
	static char [][] cpy;
	static String move;
	static int ans;
	
	static int dr[] = { 0, 1, 1, 1, 0, 0, 0, -1, -1, -1 };
	static int dc[] = { 0, -1, 0, 1, -1, 0, 1, -1, 0, 1 };
	
	static class Pair {
		int r, c;
		public Pair(int r, int c) {
			this.r = r;
			this.c = c;
		}
	}
	
	static Pair jongsu;
	static List<Pair> krajXs = new ArrayList<>();
	
	public static void copy(char [][] dst, char [][] src) {
		for(int r = 0; r < R; ++r) {
			for(int c = 0; c < C; ++c) {
				dst[r][c] = src[r][c];
			}
		}
	}
	
	public static boolean solve() {
		Stack<Pair> stack = new Stack<>();
		for(int moves = 0 ; moves < move.length(); ++moves) {
			
			for(int r = 0; r < R; ++r) {
	        	for(int c = 0; c < C; ++c) {
	        		cpy[r][c] = '.';
	        	}
	        }
			
			cpy[jongsu.r][jongsu.c] = '.';
			jongsu.r += dr[move.charAt(moves) - '0'];
			jongsu.c += dc[move.charAt(moves) - '0'];
			if (arr[jongsu.r][jongsu.c] == 'R') {
				System.out.println("kraj " + (moves + 1));
	        	return false;
			}
			cpy[jongsu.r][jongsu.c] = 'I';
			
			for(int r = 0; r < R; ++r) {
				for(int c = 0; c < C; ++c) {
					
					if (arr[r][c] == 'R') {
						int minDist = 1000000007;
						int mIndex = 0;
						
						for(int krajMv = 1; krajMv < 10; ++krajMv) {
					        int iNextR = r + dr[krajMv];
					        int iNextC = c + dc[krajMv];
					        if (iNextR >= 0 && iNextR < R && iNextC >= 0 && iNextC < C) {
						        int dist = Math.abs(iNextR - jongsu.r) + Math.abs(iNextC - jongsu.c); 
						        if (dist < minDist) {
						            minDist = dist;
						            mIndex = krajMv;    
						        }
					        }
					    }
						
						int nextR = r + dr[mIndex];
				        int nextC = c + dc[mIndex];
				        
				        if (cpy[nextR][nextC] == 'I') {
				        	System.out.println("kraj " + (moves + 1));
				        	return false;
				        }
				        else if (cpy[nextR][nextC] == 'R') {
				        	stack.push(new Pair(nextR, nextC));
				        }
				        else {
				        	cpy[nextR][nextC] = 'R';
				        }
					}
				}
			}
			
			while(!stack.empty()) {
				Pair p = stack.pop();
				cpy[p.r][p.c] = '.';
			}
			
			copy(arr, cpy);
		}
		return true;
	}
	
	public static void main(String args[]) throws Exception {
		br = new BufferedReader(new InputStreamReader(System.in));
        sb = new StringBuilder();
        
        st = new StringTokenizer(br.readLine().trim());
        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());

        arr = new char[R][C];
        cpy = new char[R][C];
        
        for(int r = 0; r < R; ++r) {
        	String s = br.readLine();
        	for(int c = 0; c < C; ++c) {
        		arr[r][c] = s.charAt(c);
        		cpy[r][c] = '.';
        		if (arr[r][c] == 'R') {
        			krajXs.add(new Pair(r, c));
        		}
        		else if (arr[r][c] == 'I') {
        			jongsu = new Pair(r, c);
        		}
        	}
        }
        move = br.readLine().trim();
        if (solve()) {
        	for(int r = 0; r < R; ++r) {
        		for(int c = 0; c < C; ++c) {
        			sb.append(arr[r][c]);
        		}
        		sb.append('\n');
        	}
        	System.out.println(sb);
        }
        
	}
}

후기

어느정도 자바 입출력이 익숙해지는 것 같다.

실제 그래프 상 이동 시뮬레이션을 오랜만에 풀어서 그런지 arr->cpy 복사 과정 구현에서 조금 애를 먹었다.

profile
말하는 감자

0개의 댓글