-
[백준] 3190 뱀 #JAVA #시뮬레이션Algorithm Solving/BAEKJOON 2021. 12. 17. 13:33
[백준] 3190 뱀 #JAVA #시뮬레이션
코드
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine());//보드 크기 int K = Integer.parseInt(br.readLine());//사과 개수 int[][] board = new int[N][N]; StringTokenizer st; for (int i = 0; i < K; i++) { //사과 자리 st = new StringTokenizer(br.readLine()); int y = Integer.parseInt(st.nextToken()); int x = Integer.parseInt(st.nextToken()); board[y-1][x-1] = 1; } Deque<int[]> snake = new LinkedList<>(); snake.addFirst(new int[] {0,0}); int snakeHead = 0; //0동 1남 2서 3북 int L = Integer.parseInt(br.readLine());//방향 전환 int[] dir = new int[10001]; for (int i = 0; i < L; i++) { st = new StringTokenizer(br.readLine()); int sec = Integer.parseInt(st.nextToken()); String d = st.nextToken(); if(d.equals("L")) dir[sec] = -1; else if(d.equals("D")) dir[sec] = 1; } int second = 0; while (true) { second++; int[] head =snake.peekFirst(); int ny = head[0]; int nx = head[1]; if(snakeHead == 0) {//동 nx += 1; } else if(snakeHead == 1) {//남 ny += 1; } else if(snakeHead == 2) {//서 nx -= 1; } else if(snakeHead == 3) {//북 ny -= 1; } //벽 부딪힘 check if(nx<0 || ny<0 || nx >=N || ny>=N) break; //몸통 부딪힘 check Iterator<int[]> iter= snake.iterator(); boolean isBody = false; while (iter.hasNext()) { int[] tmp = iter.next(); if(ny == tmp[0] && nx == tmp[1]) { isBody = true; break; } } if(isBody)break; snake.addFirst(new int[] {ny,nx});//머리 이동 if(board[ny][nx] == 1) { board[ny][nx] = 0; //사과 삭제 }else { snake.removeLast();//사과 안먹었으면 꼬리 이동 } if(dir[second] != 0) { snakeHead += dir[second]; if(snakeHead<0) snakeHead += 4; snakeHead %= 4; } } System.out.println(second); } }
풀이
- Dequeue에 뱀의 좌표를 머리 ~ 꼬리 순으로 넣는다.
- 뱀의 머리가 4방향중 어디인지 정의한다.
- 이동할 떄마다 배열 범위를 벗어나는지 체크하고, 뱀 몸통에 부딪히는지 체크한다.
- 뱀이 사과를 먹으면 몸이 길어지고, 사과는 삭제한다.
주의 사항
- 뱀의 머리가 범위를 벗어나는 것을 체크해야 한다. (0~3 범위)
- 뱀이 사과를 먹고나서 사과를 삭제해야한다.
반례
아래 반례가 되지 않는다면 사과처리에 대해 다시 확인해 본다.
#INPUT 35 28 21 2 22 23 3 5 34 30 29 31 3 28 20 12 27 26 31 7 5 10 21 10 19 2 15 23 4 23 3 19 3 35 13 30 30 30 23 27 32 17 22 24 8 27 4 8 30 18 15 28 22 29 28 5 16 33 20 27 D 61 L 68 L 100 L 133 L 160 L 165 D 168 D 170 D 182 D 206 D 207 D 214 D 215 D 216 L 237 D 240 D 241 L 251 D 252 D #OUTPUT 237
잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)
'Algorithm Solving > BAEKJOON' 카테고리의 다른 글
[백준] 1202 보석 도둑 #JAVA #우선순위 큐 (0) 2021.12.26 [백준] 7662 이중 우선순위 큐 #JAVA #이진 탐색 트리 (0) 2021.12.24 [백준] 2461 대표선수 #JAVA #투포인터 (0) 2021.11.27 [백준] 2143 두 배열의 합 #JAVA #이분탐색 (0) 2021.11.18 [백준] 11047 동전0 #JAVA (0) 2021.02.28