티스토리 뷰
1. 뱀의 몸통 좌표를 Deque 자료구조를 활용해서 저장한다. 머리를 움직일 때에는 Deque의 first에 추가하고 뱀의 꼬리를 자를 때는 Deque의 last에서 삭제한다.
2. 뱀의 전체 몸통이 차지하는 부분을 체크하기 위해 visited 배열을 선언하고, 뱀의 몸통이 위치한 자리마다
true로 체크한다.
3. 현재 이동방향에 따라 머리를 한칸 전진시킨다.
1) 머리를 전진시켰을 때, 이미 visited[row][col] = true이면, 뱀의 머리가 뱀의 몸통 중 일부를 만났다는 것이므로 종료한다.
2) 머리를 전진시켰을 때, 사과가 있다면 뱀의 꼬리를 자르지 않는다.
3) 머리를 전진시켰을 때, 빈칸이라면 꼬리를 자른다.
4) 머리를 전진시켰을 때, 벽이라면 종료한다.
4. 현재 이동시간이 입력에서 주어지는 방향을 바꿔야하는 시간과 같다면, 입력에 따라 이동방향을 바꿔준다.
[소스 코드]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; import java.util.StringTokenizer; public class Main { public static int N, K, L; public static int[][] map; public static boolean[][] visited; public static Move[] move; public static int[] dirX = new int[] { 0, 0, 1, -1 }; // 동 서 남 북 public static int[] dirY = new int[] { 1, -1, 0, 0 }; public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws Exception { StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); map = new int[N][N]; visited = new boolean[N][N]; K = Integer.parseInt(br.readLine()); for (int i = 0; i < K; i++) { st = new StringTokenizer(br.readLine()); int row = Integer.parseInt(st.nextToken()); int col = Integer.parseInt(st.nextToken()); map[row - 1][col - 1] = 1; } L = Integer.parseInt(br.readLine()); move = new Move[L]; for (int i = 0; i < L; i++) { st = new StringTokenizer(br.readLine()); int time = Integer.parseInt(st.nextToken()); char dir = st.nextToken().charAt(0); move[i] = new Move(time, dir); } System.out.println(solve()); } public static int solve() { int curDir = 0; int curTime = 1; int idx = 0; Deque<Node> q = new ArrayDeque<>(); q.offerFirst(new Node(0, 0)); visited[0][0] = true; while (true) { Node head = q.peekFirst(); int nr = head.row + dirX[curDir]; int nc = head.col + dirY[curDir]; // 벽을 만났을 경우 if (!isBoundary(nr, nc)) return curTime; // 뱀의 몸통을 만났을 경우 if (visited[nr][nc]) return curTime; // 사과를 만났을 경우 if (map[nr][nc] == 1) { // 꼬리를 자르지 않고, 머리에 추가한다. map[nr][nc] = 0; q.offerFirst(new Node(nr, nc)); visited[nr][nc] = true; } else { // 빈칸일 경우 // 머리를 한칸 전진시키고, 꼬리를 자른다. Node tail = q.pollLast(); visited[tail.row][tail.col] = false; q.offerFirst(new Node(nr, nc)); visited[nr][nc] = true; } // 입력으로 주어진, 방향을 바꿔야할 시간이 되면 방향을 바꿔준다. if (idx < L && curTime == move[idx].time) { curDir = getNextDirection(curDir, move[idx].dir); idx += 1; } curTime += 1; } } public static int getNextDirection(int curDir, char dir) { // 오른쪽으로 회전 if (dir == 'D') { if (curDir == 0) return 2; else if (curDir == 1) return 3; else if (curDir == 2) return 1; else return 0; } else { if (curDir == 0) return 3; else if (curDir == 1) return 2; else if (curDir == 2) return 0; else return 1; } } public static boolean isBoundary(int row, int col) { return (row >= 0 && row < N) && (col >= 0 && col < N); } } class Node { int row; int col; public Node(int row, int col) { this.row = row; this.col = col; } } class Move { int time; char dir; public Move(int time, char dir) { this.time = time; this.dir = dir; } } | cs |
'알고리즘 문제 > 백준(BOJ)' 카테고리의 다른 글
[백준 14503번] 로봇 청소기 :: 늦깎이 IT (0) | 2019.03.19 |
---|---|
[백준 14502번] 연구소 :: 늦깎이 IT (0) | 2019.03.18 |
[백준 13460번] 구슬 탈출2 :: 늦깎이 IT (0) | 2019.03.12 |
[백준 14888번] 연산자 끼워넣기 :: 늦깎이 IT (0) | 2019.03.12 |
[백준 14889번] 스타트와 링크 :: 늦깎이 IT (0) | 2019.03.09 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 브루트포스
- BFS
- 큐
- 탐색
- 알고스팟
- 트리
- 백준
- 중간값
- 배열
- 탈주범 검거
- 정렬
- 시뮬레이션
- SWEA
- 14888
- DFS
- 리스트
- 힙
- 알고리즘
- 영역 구하기
- 힙정렬
- 구슬 탈출2
- 자바
- 연산자 끼워넣기
- 나무 재테크
- 삼성
- 최소힙
- 최대힙
- 우선순위 큐
- 구현
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함