728x90
문제
https://www.acmicpc.net/problem/17837
어떻게 풀 것인가?
이번 문제도 빡 구현이었다.
사실 문제를 처음에 읽었을 때는 그다지 어렵지않다고 생각을 하였으나, 이번에도 생각보다 조건이 까다롭다고 느꼈다.
특히나 2번 빨간색일때, 빨간색인 경우에는 이동한 후에 A번 말과 그 위에 있는 모든 말의 쌓여있는 순서를 반대로 바꾼다.
이 부분을 해결하기 위해서 전체적으로 자료구조를 뒤엎어야만 했다.
그 외 부분은 읽으면서 코드로 옮긴다면 풀 수 있을 것이다.
풀면서 놓쳤던점
조건을 놓치지 말자.
이 문제를 통해 얻어갈 것
빡구현 문제
내 코드
import java.util.*;
import java.io.*;
public class Main {
static int[] dx = {0, 0, 0, -1, 1};
static int[] dy = {0, 1, -1, 0, 0};
static int[][] map;
static int n, k;
static int cnt = 0;
static Chess[] chesses;
static ArrayList<Integer>[][] list;
static ArrayList<Integer> tmp = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
String[] t = br.readLine().split(" ");
n = Integer.parseInt(t[0]);
k = Integer.parseInt(t[1]);
chesses = new Chess[k + 1];
map = new int[n + 1][n + 1];
list = new ArrayList[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
list[i][j] = new ArrayList<>();
}
}
for (int i = 1; i <= n; i++) {
String[] strs = br.readLine().split(" ");
for (int j = 1; j <= n; j++) {
map[i][j] = Integer.parseInt(strs[j - 1]);
}
}
for (int i = 1; i <= k; i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int dir = Integer.parseInt(st.nextToken());
list[r][c].add(i);
chesses[i] = new Chess(r, c, dir);
}
simulation();
}
public static void simulation() {
while (cnt <= 1000) {
cnt++;
move();
}
System.out.println(-1);
}
public static void move() {
for (int i = 1; i <= k; i++) {
Chess a = chesses[i];
int nx = a.x + dx[a.dir];
int ny = a.y + dy[a.dir];
if (!isRange(nx, ny) || map[nx][ny] == 2) {
chesses[i].dir = change_dir(a.dir);
int tmp_x = chesses[i].x + dx[chesses[i].dir];
int tmp_y = chesses[i].y + dy[chesses[i].dir];
if (isRange(tmp_x, tmp_y) && map[tmp_x][tmp_y] != 2) {
remove(a.x, a.y, tmp_x, tmp_y, i, map[tmp_x][tmp_y] != 0);
}
} else if (isRange(nx, ny) && map[nx][ny] == 0) {
remove(a.x, a.y, nx, ny, i, false);
} else if (isRange(nx, ny) && map[nx][ny] == 1) {
remove(a.x, a.y, nx, ny, i, true);
}
if (end()) {
System.out.println(cnt);
System.exit(0);
}
}
}
public static boolean end() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (list[i][j].size() >= 4) {
return true;
}
}
}
return false;
}
public static void remove(int bx, int by, int nx, int ny, int num, boolean check) {
int size = list[bx][by].size();
boolean flag = true;
tmp.clear();
int idx = 0;
for (int i = 0; i < size; i++) {
if (list[bx][by].get(i) == num) {
idx = i;
flag = false;
}
if (!flag) {
tmp.add(list[bx][by].get(i));
}
}
if (check) {
Collections.reverse(tmp);
}
if (size > idx) {
list[bx][by].subList(idx, size).clear();
}
for (Integer integer : tmp) {
chesses[integer].x = nx;
chesses[integer].y = ny;
list[nx][ny].add(integer);
}
}
public static int change_dir(int dir) {
switch(dir) {
case 1:
return 2;
case 2:
return 1;
case 3:
return 4;
case 4:
return 3;
}
return 100000;
}
public static boolean isRange(int x, int y) {
return x >= 1 && y >= 1 && x <= n && y <= n;
}
}
class Chess {
int x, y, dir;
Chess(int x, int y, int dir) {
this.x = x;
this.y = y;
this.dir = dir;
}
}
참고
https://suhyeokeee.tistory.com/118
728x90
'BaekJoon' 카테고리의 다른 글
[Baekjoon] 17779번 게리맨더링 2 (Java) 문제 풀이 [Gold 3] (0) | 2024.04.14 |
---|---|
[Baekjoon] 13335번 트럭 (Java) 문제 풀이 [Silver 1] (0) | 2024.04.13 |
[Baekjoon] 2110번 공유기 설치 (Java) 문제 풀이 [Gold 4] (0) | 2024.04.13 |
[Baekjoon] 1600번 말이 되고픈 원숭이 (Java) 문제 풀이 [Gold 3] (0) | 2024.04.12 |
[Baekjoon] 15685번 드래곤 커브 (Java) 문제 풀이 [Gold 3] (0) | 2024.04.12 |