[JAVA] CodeTree ์ธ์ ๋
์ฝ๋ํธ๋ฆฌ | ์ฝ๋ฉํ ์คํธ ์ค๋น๋ฅผ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ ์
๊ตญ๊ฐ๋ํ๊ฐ ๋ง๋ ์ฝ๋ฉ ๊ณต๋ถ์ ๊ฐ์ด๋๋ถ ์ฝ๋ฉ ์์ด๋ณด๋ถํฐ ๊ฟ์ ์ง์ฅ ์ฝํ ํฉ๊ฒฉ๊น์ง, ๊ตญ๊ฐ๋ํ๊ฐ ์์ ํ ์ปค๋ฆฌํ๋ผ์ผ๋ก ์ค๋นํด๋ณด์ธ์.
www.codetree.ai
๐ก ์๋ฎฌ๋ ์ด์ ๋ฌธ์ ์ด๋ค. BFS, DFS ๋ฑ์ ์ฌ์ฉํ์ง ์๋๋ค.
1. ์ฌ๋ฌ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ด๋ค.
2. ์ฌ๋, ์ด, ํ์ฌ ์์น์ ์๋ ์ฌ๋์ ๋ฒํธ ์ธ๊ฐ์ง๋ฅผ ๋ชจ๋ ๋ฐ๋ก ์ ์ฅํด๋์์ผ๋ฏ๋ก ์ ๋ณด๊ฐ ๋ฐ๋๋
๋ชจ๋๋ฅผ ๊ฐฑ์ ์์ผ์ผ ํ๋ค!
3. ๋ฌธ์ ์ค๋ช
์ด ์กฐ๊ธ ํท๊ฐ๋ฆด ์ ์๋๋ฐ 1๋ฒ์ด ์ด๋ํ์ฌ 2๋ฒ๊ณผ ๋๊ฒฐํ ๋ค 2๋ฒ์ด ์ ธ์ ๋ค๋ฅธ ์์น๋ก ์ด๋ํ์ฌ๋
๋ฐ๋ก 2๋ฒ์ ์์ ์ ์ฐจ๋ก์ ์ด๋์ ์งํ ํด์ผํ๋ค.
์ ์ฒด ์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static int N, M, K;
static ArrayList<Integer>[][] gun; // ํด๋น ์์น์ ์ด ์ ๋ณด. ์์ผ๋ฉด size๊ฐ 0
static int[][] people; // ํด๋น ์์น์ ์ฌ๋ ์ ๋ณด (person์ number๋ฅผ ์ ์ฅํจ)
static class person{
int number; // ๋ฒํธ
int power; // ์ด๊ธฐ ๋ฅ๋ ฅ์น
int gun; // ๊ฐ์ง ์ด์ ๊ณต๊ฒฉ๋ ฅ 0์ด๋ฉด ์ด์ด ์๋ค.
int d; // ๋ฐฉํฅ
int x; int y;
public person(int number, int x, int y, int d, int power) {
super();
this.number = number;
this.power = power;
this.d = d;
this.x = x;
this.y = y;
}
}
static ArrayDeque<person> p;
static int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};
static int[] score;
public static void main(String args[]) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
N = Integer.parseInt(st.nextToken()); //๊ฒฉ์ ํฌ๊ธฐ
M = Integer.parseInt(st.nextToken()); //ํ๋ ์ด์ด์
K = Integer.parseInt(st.nextToken()); //๋ผ์ด๋ ์
score = new int[M+1]; // score[1] = 1๋ฒ ํ๋ ์ด์ด์ ์ ์
gun = new ArrayList[N][N];
people = new int[N][N];
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
gun[i][j] = new ArrayList<>();
for(int i=0; i<N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for(int j=0; j<N; j++) {
int g = Integer.parseInt(st.nextToken());
if(g != 0)
gun[i][j].add(g);
}
}
p = new ArrayDeque<>();
for(int i=1; i<=M; i++) {
st = new StringTokenizer(bf.readLine(), " ");
int x = Integer.parseInt(st.nextToken())-1;
int y = Integer.parseInt(st.nextToken())-1;
int d = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
people[x][y] = i;
p.offer(new person(i, x, y, d, s));
}
int time = 0;
while(++time <= K) {
move_people();
}
for(int i=1; i<=M; i++)
sb.append(score[i]).append(" ");
System.out.println(sb);
}
static void move_people() {
int cnt = 0;
while(++cnt <= M) {
person player = p.poll();
int nx = player.x+dx[player.d];
int ny = player.y+dy[player.d];
if(nx < 0 || ny < 0 || nx >= N || ny >= N) {
player.d += 2;
player.d %= 4;
nx = player.x+dx[player.d];
ny = player.y+dy[player.d];
}
if(people[nx][ny] == 0) { // ํด๋น ์์น์ ์ฌ๋์ด ์๋ ๊ฒฝ์ฐ
if(gun[nx][ny].size() != 0) { // ํด๋น ์์น์ ์ด์ด ์๋ ๊ฒฝ์ฐ
int max = player.gun; int max_idx = -1;
for(int i=0; i<gun[nx][ny].size(); i++) {
int g = gun[nx][ny].get(i);
if(max < g) {
max = g; max_idx = i;
}
}
if(max_idx != -1) { // ์ด ๋ณ๊ฒฝ
gun[nx][ny].remove(max_idx);
if(player.gun != 0) gun[nx][ny].add(player.gun);
player.gun = max;
}
}
people[player.x][player.y] = 0; // ์ด๋ ์ ์์น ํ์ ์ง์ฐ๊ธฐ
people[nx][ny] = player.number; // ์ด๋ํ๊ธฐ
player.x = nx;
player.y = ny; // ์ขํ ๋ณ๊ฒฝ
p.offer(player);
}
else { // ์๋ ๊ฒฝ์ฐ
int vs = people[nx][ny]; // ๋๊ฒฐ ์๋์ number
people[player.x][player.y] = 0; // ์ด๋ฏธ ์ด๋ํ์ผ๋ฏ๋ก ์ง์ ์์น ํ์ ์ง์
player.x = nx;
player.y = ny; //์ด๋ฏธ ์ด๋ํ์ผ๋ฏ๋ก player ์ขํ ๊ฐ ์์
fire(vs, player);
}
}
}
static void fire(int vs, person now) {
int cnt = 0;
while(++cnt < M) { // ํ์ฌ ํ๋ ์ด์ด๊ฐ ์ ๊น ๋์์์ผ๋ฏ๋ก M-1๋ฒ ์งํ
person v = p.poll();
if(v.number != vs) p.offer(v); // ๋๊ฒฐ์๋๊ฐ ์๋๋ฉด ๋ค์ ๋ฃ์ด์ฃผ๊ธฐ
else {
if(v.power + v.gun < now.power + now.gun || (v.power + v.gun == now.power + now.gun && v.power < now.power)) {
// v๊ฐ ์ก์
score[now.number] += (now.power + now.gun) - (v.power + v.gun); // ์ ์ ์ฆ๊ฐ์ํค๊ธฐ
people[v.x][v.y] = now.number; // ํด๋น ์์น์๋ now๊ฐ ๋จ์
if(now.gun < v.gun) { // v๊ฐ ํด๋น ๊ฒฉ์์์ ๊ฐ์ฅ ํฐ ์ด์ ๊ฐ์ง๊ณ ์์ ๊ฒ์ด๋ฏ๋ก vํ๊ณ ๋ง ๋น๊ตํ๊ธฐ
if(now.gun != 0) gun[now.x][now.y].add(now.gun);
now.gun = v.gun;
}
else
if(v.gun != 0)
gun[v.x][v.y].add(v.gun); // v๊ฐ ์ด์ ๊ฐ์ง๊ณ ์์๋ค๋ฉด ์ด์ ๋ด๋ ค๋๊ธฐ
v.gun = 0;
for(int d=0; d<4; d++) {
int nx = v.x + dx[(v.d + d) % 4];
int ny = v.y + dy[(v.d + d) % 4];
if(nx < 0 || ny < 0 || nx >= N || ny >= N || people[nx][ny] != 0) continue; // ๊ฒฉ์์์ ๋ฒ์ด๋๊ฑฐ๋ ์ฌ๋์ด ์๋ ๊ฒฝ์ฐ๋ ๋ค๋ฅธ ๊ฒฉ์ ์ฐพ๊ธฐ
people[nx][ny] = v.number;
v.x = nx; v.y = ny;
v.d = (v.d + d) % 4; // ๋ฐฉํฅ์ด ๋ฐ๋์์ผ๋ฏ๋ก ์ขํ์ ์ด๋ ๋ฐฉํฅ ๊ฐฑ์
break;
}
int max = 0; int max_idx = -1;
for(int i=0; i<gun[v.x][v.y].size(); i++) {
int g = gun[v.x][v.y].get(i);
if(max < g) {
max = g; max_idx = i;
}
}
if(max_idx != -1) {
gun[v.x][v.y].remove(max_idx);
v.gun = max;
}
p.offer(v); // v์ ๋ชจ๋ ์ ๋ณด๊ฐ ๊ฐฑ์ ๋์์ผ๋ฏ๋ก queue์ ๋ฃ๋๋ค.
}
else {
// v๊ฐ ์ด๊ฒผ์
score[v.number] += (v.power + v.gun) - (now.power + now.gun);
// v๋ ์ด๋ฏธ ์นธ์ ๊ฐ์ฅ ๊ณต๊ฒฉ๋ ฅ์ด ๋์ ์ด์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ง ํ๋ ์ด์ด์ ์ด๋ง ๋น๊ต
if(now.gun > v.gun) {
if(v.gun != 0) gun[v.x][v.y].add(v.gun);
v.gun = now.gun;
}
else if(now.gun != 0)
gun[v.x][v.y].add(now.gun); // ์ง ํ๋ ์ด์ด ์ด ๋ด๋ ค๋์
now.gun = 0;
p.offer(v); // v๋ ์ด์ ์ ๋ณด๋ฅผ ์ ์ธํ๊ณ ๊ฐฑ์ ํ ๊ฒ์ด ์์ผ๋ฏ๋ก queue์ ๋ฃ์ด์ค๋ค.
for(int d=0; d<4; d++) {
int nx = now.x + dx[(now.d + d) % 4];
int ny = now.y + dy[(now.d + d) % 4];
if(nx < 0 || ny < 0 || nx >= N || ny >= N || people[nx][ny] != 0) continue;
people[nx][ny] = now.number;
now.x = nx; now.y = ny;
now.d = (now.d + d) % 4;
break;
}
int max = 0; int max_idx = -1;
for(int i=0; i<gun[now.x][now.y].size(); i++) {
int g = gun[now.x][now.y].get(i);
if(max < g) {
max = g; max_idx = i;
}
}
if(max_idx != -1) {
gun[now.x][now.y].remove(max_idx);
now.gun = max;
}
}
}
}
p.offer(now); // ๋ง์ง๋ง์ ๋ฃ์ด์ฃผ์ด์ผ ์ํ๋ ์์ ์ ์ง
}
}
ํ ์ค ์ฉ ์ดํด๋ณด์
static int N, M, K;
static ArrayList<Integer>[][] gun; // ํด๋น ์์น์ ์ด ์ ๋ณด. ์์ผ๋ฉด size๊ฐ 0
static int[][] people; // ํด๋น ์์น์ ์ฌ๋ ์ ๋ณด (person์ number๋ฅผ ์ ์ฅํจ)
static class person{
int number; // ๋ฒํธ
int power; // ์ด๊ธฐ ๋ฅ๋ ฅ์น
int gun; // ๊ฐ์ง ์ด์ ๊ณต๊ฒฉ๋ ฅ 0์ด๋ฉด ์ด์ด ์๋ค.
int d; // ๋ฐฉํฅ
int x; int y;
public person(int number, int x, int y, int d, int power) {
super();
this.number = number;
this.power = power;
this.d = d;
this.x = x;
this.y = y;
}
}
static ArrayDeque<person> p;
static int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};
static int[] score;
์ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์๊ณ , ์ฌ๋ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ ArrayDeque์ ์ ์ธํ์๋ค. ์ด๋ deque์ person num ์์๋๋ก๋ฅผ ์ ์งํ๋๋ก ํ์๋ค.
์ด์ฐจ์ ๋ฐฐ์ด people์ ํตํด ํ์ฌ ์์นํ ์ฌ๋์ ๋ฒํธ๋ฅผ ์ ์ฅํ์๋ค. ํ์ฌ ์์น์ ์ฌ๋์ด ์๋์ง ๋น ๋ฅด๊ฒ ํ์ ํ๊ธฐ ์ํจ์ด๋ค.
static void move_people() {
int cnt = 0;
while(++cnt <= M) {
person player = p.poll();
int nx = player.x+dx[player.d];
int ny = player.y+dy[player.d];
if(nx < 0 || ny < 0 || nx >= N || ny >= N) {
player.d += 2;
player.d %= 4;
nx = player.x+dx[player.d];
ny = player.y+dy[player.d];
}
if(people[nx][ny] == 0) { // ํด๋น ์์น์ ์ฌ๋์ด ์๋ ๊ฒฝ์ฐ
if(gun[nx][ny].size() != 0) { // ํด๋น ์์น์ ์ด์ด ์๋ ๊ฒฝ์ฐ
int max = player.gun; int max_idx = -1;
for(int i=0; i<gun[nx][ny].size(); i++) {
int g = gun[nx][ny].get(i);
if(max < g) {
max = g; max_idx = i;
}
}
if(max_idx != -1) { // ์ด ๋ณ๊ฒฝ
gun[nx][ny].remove(max_idx);
if(player.gun != 0) gun[nx][ny].add(player.gun);
player.gun = max;
}
}
people[player.x][player.y] = 0; // ์ด๋ ์ ์์น ํ์ ์ง์ฐ๊ธฐ
people[nx][ny] = player.number; // ์ด๋ํ๊ธฐ
player.x = nx;
player.y = ny; // ์ขํ ๋ณ๊ฒฝ
p.offer(player);
}
else { // ์๋ ๊ฒฝ์ฐ
int vs = people[nx][ny]; // ๋๊ฒฐ ์๋์ number
people[player.x][player.y] = 0; // ์ด๋ฏธ ์ด๋ํ์ผ๋ฏ๋ก ์ง์ ์์น ํ์ ์ง์
player.x = nx;
player.y = ny; //์ด๋ฏธ ์ด๋ํ์ผ๋ฏ๋ก player ์ขํ ๊ฐ ์์
fire(vs, player);
}
}
}
move_people()์ ํตํด ๋ชจ๋ ์ฌ๋๋ค์ ์กฐ๊ฑด์ ๋ง๊ฒ ์ด๋์์ผฐ๋ค.
M๋ช ์ด ์ด๋ํ๋ฏ๋ก ํ์๋ M๋ฒ์ด ๋๋ค.
people์ด 0์ด๋ฉด ์ด๋ ์์น์ ์ฌ๋์ด ์๋ค๋ ๋ป์ด๋ฏ๋ก ํด๋น ์์น์์ ์ด์ ๊ฐฑ์ ํ๋ค.
์ด ์ด๋์ ํตํด person์ x, y, (d), gun์ด ๊ฐฑ์ ๋จ์ ์ ์ํ์! ๋ํ person์ ์์น๊ฐ ๊ฐฑ์ ๋์๊ธฐ ๋๋ฌธ์ ์ด์ฐจ์ ๋ฐฐ์ด people์ ์ ๋ณด๋ ๊ฐฑ์ ํด์ผ ํ๋ค.
ํด๋น ์์น์์ ์ด์ ์ ๋ณด๋ฅผ ๊ฐฑ์ ์ํฌ ๋ max์ ๊ฐ์ player.gun์ผ๋ก ์ฃผ์ง์๊ณ 0์ผ๋ก ์ฃผ๊ฒ ๋๋ฉด player๊ฐ ๊ณต๊ฒฉ๋ ฅ์ด ๋ ํฐ ์ด์ ๊ฐ์ง๊ณ ์๋๋ผ๋ ํด๋น ์์น์์ ๊ฐ์ฅ ํฐ ๊ณต๊ฒฉ๋ ฅ์ ๊ฐ์ง ์ด์ผ๋ก ๋ฐ๋๊ฒ ๋๋ค. → ์ฃผ์
๋ง์ฝ ์ด๋ ์์น์ ์ฌ๋์ด ์๋ค๋ฉด ํด๋น player์ ์ ๋ณด๋ฅผ ๊ฐฑ์ ํ๊ณ fireํจ์๋ก ์ฒ๋ฆฌํ์๋ค.
static void fire(int vs, person now) {
int cnt = 0;
while(++cnt < M) { // ํ์ฌ ํ๋ ์ด์ด๊ฐ ์ ๊น ๋์์์ผ๋ฏ๋ก M-1๋ฒ ์งํ
person v = p.poll();
if(v.number != vs) p.offer(v); // ๋๊ฒฐ์๋๊ฐ ์๋๋ฉด ๋ค์ ๋ฃ์ด์ฃผ๊ธฐ
else {
if(v.power + v.gun < now.power + now.gun || (v.power + v.gun == now.power + now.gun && v.power < now.power)) {
// v๊ฐ ์ก์
score[now.number] += (now.power + now.gun) - (v.power + v.gun); // ์ ์ ์ฆ๊ฐ์ํค๊ธฐ
people[v.x][v.y] = now.number; // ํด๋น ์์น์๋ now๊ฐ ๋จ์
if(now.gun < v.gun) { // v๊ฐ ํด๋น ๊ฒฉ์์์ ๊ฐ์ฅ ํฐ ์ด์ ๊ฐ์ง๊ณ ์์ ๊ฒ์ด๋ฏ๋ก vํ๊ณ ๋ง ๋น๊ตํ๊ธฐ
if(now.gun != 0) gun[now.x][now.y].add(now.gun);
now.gun = v.gun;
}
else
if(v.gun != 0)
gun[v.x][v.y].add(v.gun); // v๊ฐ ์ด์ ๊ฐ์ง๊ณ ์์๋ค๋ฉด ์ด์ ๋ด๋ ค๋๊ธฐ
v.gun = 0;
for(int d=0; d<4; d++) {
int nx = v.x + dx[(v.d + d) % 4];
int ny = v.y + dy[(v.d + d) % 4];
if(nx < 0 || ny < 0 || nx >= N || ny >= N || people[nx][ny] != 0) continue; // ๊ฒฉ์์์ ๋ฒ์ด๋๊ฑฐ๋ ์ฌ๋์ด ์๋ ๊ฒฝ์ฐ๋ ๋ค๋ฅธ ๊ฒฉ์ ์ฐพ๊ธฐ
people[nx][ny] = v.number;
v.x = nx; v.y = ny;
v.d = (v.d + d) % 4; // ๋ฐฉํฅ์ด ๋ฐ๋์์ผ๋ฏ๋ก ์ขํ์ ์ด๋ ๋ฐฉํฅ ๊ฐฑ์
break;
}
int max = 0; int max_idx = -1;
for(int i=0; i<gun[v.x][v.y].size(); i++) {
int g = gun[v.x][v.y].get(i);
if(max < g) {
max = g; max_idx = i;
}
}
if(max_idx != -1) {
gun[v.x][v.y].remove(max_idx);
v.gun = max;
}
p.offer(v); // v์ ๋ชจ๋ ์ ๋ณด๊ฐ ๊ฐฑ์ ๋์์ผ๋ฏ๋ก queue์ ๋ฃ๋๋ค.
}
์์๋ ๋ด์ฉ์ ๊ฐ์ผ๋ฏ๋ก ์๋ง ์ค๋ช ํ๊ฒ ๋ค.
๋จผ์ ๋๊ฒฐ ์๋์ธ v๋ฅผ ์ฐพ์์ค๋ค. deque์ ์์ ์ ์ง๋ฅผ ์ํด ๋บ ๋ค์ ๋ฐ๋ก ๋งจ ๋ค์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
now ์ฆ ํ์ฌ ํ๋ ์ด์ด๊ฐ ์ด๊ธด๋ค๋ฉด ์ ์๋ฅผ ๊ฐฑ์ ํ๋ค.
๋ํ ํด๋น ์์น์ ์๋ฅํ ํ๋ ์ด์ด๋ now์ด๋ฏ๋ก people๋ ๊ฐฑ์ ํ๋ค.
์ด๋ v๋ ์์ ์ ์ด์ ๋๊ณ ๊ฐ๊ฒ ๋๋ค. v๋ ์ด๋ฏธ ํด๋น ์นธ์์ ๊ฐฑ์ ๋ ์ด์ ๋ค๊ณ ์์ ๊ฒ์ด๋ฏ๋ก ๊ฐ์ฅ ํฐ ์ด์ ๋ค๊ณ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก player๋ v์ ์ด๋ง ๋น๊ตํด์ฃผ๋ฉด ๋๋ค.
v๋ ์ด์ ๋ด๋ ค๋จ์ผ๋ฏ๋ก v.gun์ 0์ด ๋์ด์ผ ํ๋ค
๋ฌธ์ ์์ ์ ์๋ ๋๋ก v์ ์์น๋ฅผ ์ฎ๊ธฐ๊ณ x, y, d, people์ ๊ฐฑ์ ํ๋ค.
v๋ ์ด๋ํ ์์น์์ ๊ฐ์ฅ ํฐ ์ด์ ๋ค๊ฒ ๋๋ค. move_people์์์ฒ๋ผ ์ด์ ์ฐพ์์ค๋ค. ์ด๋ max๋ฅผ v.gun์ผ๋ก ์ฃผ์ด๋ ๋๊ณ 0์ผ๋ก ์ฃผ์ด๋ ๋๋ค. ์๋ํ๋ฉด v๋ ์ด์ ๋ค๊ณ ์์ง ์๊ธฐ ๋๋ฌธ.
now์ ์นํจ์ ๊ด๋ จ์์ด now๋ ํจ์ return ์ง์ ์ deque์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค!!! → โญ์์์ ์ง