문제
https://www.acmicpc.net/problem/17837
입출력
4 4
0 0 2 0
0 0 1 0
0 0 1 2
0 2 0 0
2 1 1
3 2 3
2 2 1
4 1 2
-1
아이디어
subList 사용할 때 new ArrayList<>()로 생성하자
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
static int N, K;
static final int WHITE = 0, RED = 1, BLUE = 2;
static int[][] box;
static List<Integer>[][] players;
static Map<Integer, int[]> idToPos;
static int[] playerDirs;
static int[][] way = { { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
box = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
box[i][j] = Integer.parseInt(st.nextToken());
}
}
players = new ArrayList[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
players[i][j] = new ArrayList<>();
}
}
idToPos = new HashMap<>();
playerDirs = new int[K];
for (int k = 0; k < K; k++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken()) - 1;
int c = Integer.parseInt(st.nextToken()) - 1;
int d = Integer.parseInt(st.nextToken()) - 1;
idToPos.put(k, new int[] { r, c });
playerDirs[k] = d;
players[r][c].add(k);
}
int turn = 0;
while (true) {
turn++;
if (turn > 1000) {
System.out.println(-1);
return;
}
for (int k = 0; k < K; k++) {
int[] pos = idToPos.get(k);
int dir = playerDirs[k];
int index = players[pos[0]][pos[1]].indexOf(k);
if (index == -1)
continue;
List<Integer> move = new ArrayList<>(
players[pos[0]][pos[1]].subList(index, players[pos[0]][pos[1]].size()));
players[pos[0]][pos[1]] = new ArrayList<>(players[pos[0]][pos[1]].subList(0, index));
int nx = pos[0] + way[dir][0];
int ny = pos[1] + way[dir][1];
if (nx < 0 || nx >= N || ny < 0 || ny >= N || box[nx][ny] == BLUE) {
dir = reverse(dir);
playerDirs[k] = dir;
nx = pos[0] + way[dir][0];
ny = pos[1] + way[dir][1];
if (nx < 0 || nx >= N || ny < 0 || ny >= N || box[nx][ny] == BLUE) {
players[pos[0]][pos[1]].addAll(move);
continue;
}
}
if (box[nx][ny] == WHITE) {
players[nx][ny].addAll(move);
} else if (box[nx][ny] == RED) {
Collections.reverse(move);
players[nx][ny].addAll(move);
}
for (int m : move) {
idToPos.put(m, new int[] { nx, ny });
}
if (players[nx][ny].size() >= 4) {
System.out.println(turn);
return;
}
}
}
}
static int reverse(int d) {
if (d == 0)
return 1;
if (d == 1)
return 0;
if (d == 2)
return 3;
return 2;
}
}
'Java' 카테고리의 다른 글
[백준] 11057 : 오르막 수 (0) | 2025.03.08 |
---|---|
[코드트리] 부분 수열의 합(DP) (0) | 2025.03.08 |
[백준] 19238 : 스타트택시 (0) | 2025.03.07 |
[백준] 17135 : 캐슬 디펜스 (0) | 2025.03.07 |
[백준] 19942: 다이어트 (0) | 2025.03.03 |