์ฝ๋ํธ๋ฆฌ | ์ฝ๋ฉํ ์คํธ ์ค๋น๋ฅผ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ ์
๊ตญ๊ฐ๋ํ๊ฐ ๋ง๋ ์ฝ๋ฉ ๊ณต๋ถ์ ๊ฐ์ด๋๋ถ ์ฝ๋ฉ ์์ด๋ณด๋ถํฐ ๊ฟ์ ์ง์ฅ ์ฝํ ํฉ๊ฒฉ๊น์ง, ๊ตญ๊ฐ๋ํ๊ฐ ์์ ํ ์ปค๋ฆฌํ๋ผ์ผ๋ก ์ค๋นํด๋ณด์ธ์.
www.codetree.ai
ํ์ด๊ณผ์
ํจ์๋ณ๋ก ๋ชจ๋ํ๋ฅผ ์ ์์ผ์ผํ์ผ๋ฉฐ, ๊ตฌํ๊ณผ์ ์ด ๋ณต์กํ๋ค ๋ณด๋ ์ฒ์ ์์ํ ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ์ ํด์ ์ฌ์ฉํด์ผ ํ์ต๋๋ค.
์ฌ์ฉํ ํด๋์ค์ ๋ณ์
์ ์ฒด์ ์ธ ์ฐํ์ ๋ฃจ๋ํ์ ์์น๋ 2์ฐจ์ ๋ฐฐ์ด(int[][] map)์ ์ ์ํ์ผ๋ก ์ ์ฅํ๊ณ , ์ธ๋ถ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ณ์๋ฅผ ๋ง๋ค์ด์ 2์ฐจ์ ๋ฐฐ์ด(int[][] map)๊ณผ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํ์ต๋๋ค.
- Santa ํด๋์ค
- (r, c)์ขํ
- ๋ฃจ๋ํ์์ ๊ฑฐ๋ฆฌ
- ์ ์
- ๊ธฐ์ ์คํ
- ๋ผ์ธ ์์์ฌ๋ถ
- static int N,M,P,C,D;
- static int[][] map; // N*N, ์ฐํ๋ค์ ๋ฒํธ, ๋ฃจ๋ํ ํ์(-1)
- ์ฐํ์ ๋ฃจ๋ํ๋ฅผ N*N ๋ฐฐ์ด์ ์ ์๋ก ํ์ํด์ผ ํฉ๋๋ค.
- ๊ทธ ์ด์ ๋, ์ฐํ์ ๋ฃจ๋ํ ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ ์ด๋ ๋ฐฉํฅ ๊ฒฐ์ , ์ถฉ๋์ ๋ฐ๋ฅธ ์ฐ์์์ฉ(?)์ ๊ตฌํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- -1 : ๋ฃจ๋ํ
- 1,2,3 ... P : ์ฐํ
- static Santa[] santas; // 1๋ฒ ์ฐํ, 2๋ฒ ์ฐํ์ ์ ๋ณด๋ฅผ ์ ์ฅ
- 2์ฐจ์ ๋ฐฐ์ด map์ ์ฐํ๋ค์ ๋ฒํธ๋ฅผ ์ ์ฅํ๊ณ , ๊ทธ ๋ฒํธ์ ํด๋นํ๋ ์ฐํ ๊ฐ์ฒด๋ค์ santas ๋ฐฐ์ด์ ์ ์ฅํฉ๋๋ค.
- ์ฐํ๋ค์ ๊ธฐ์ ์คํ๊ณผ, ์ ์, ๋ผ์ธ ์์์ฌ๋ถ, ๋ฃจ๋ํ์์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๊ณ ํ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- static int[] rudolf; // ๋ฃจ๋ํ์ ์ขํ
- ๋ฃจ๋ํ์ ์ขํ๋ฅผ ๊ธฐ์ตํ๊ณ ์์ด์ผ, ์ฐํ์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ธฐ ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ฃจ๋ํ์ ์ขํ๋ฅผ 1์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅํ์ต๋๋ค.
- static int[] dr = {-1,0,1,0};
- static int[] dc = {0,1,0,-1};
- ์ฐํ์ ์ด๋๋ฐฉํฅ์ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฉํฅ๋ฒกํฐ ์ ๋๋ค.
- static int live_santa_cnt;
- ํ์ฌ ๋จ์์๋ ์ฐํ์ ๊ฐฏ์๋ฅผ ์ ์ฅํ๋ ๋ณ์์ ๋๋ค.
- PriorityQueue
- ๋ฃจ๋ํ์ ์ฐํ์ ์ด๋๋ฐฉํฅ์ ๊ฒฐ์ ํ ๋ ์ฐ์ ์์ํ๋ฅผ ํ์ฉํด์ ๊ตฌํํ์ต๋๋ค.
ํจ์
๋ฃจ๋ํ๋ฅผ ์์ง์ด๋ ํจ์(move_rudolf)
static void move_rudolf() {
// 1. ๊ฐ์ฅ ๊ฐ๊น์ด ์ฐํ๋ฅผ ์ฐพ๋ ํจ์(find_nearest_santa)๋ฅผ ํธ์ถํฉ๋๋ค.
Santa finded_santa = find_nearest_santa();
// 2. ์ฐพ์์ง ์ฐํ ๊ฐ์ฒด์ (r,c)๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฃจ๋ํ์ ๋ฐฉํฅ์ ์ค์ ํฉ๋๋ค.
int dc = 0;
if(rudolf[1]>finded_santa.c) {
dc = -1;
}else if(rudolf[1]<finded_santa.c) {
dc = 1;
}
int dr = 0;
if(rudolf[0]>finded_santa.r) {
dr = -1;
}else if(rudolf[0]<finded_santa.r) {
dr = 1;
}
// 3. map๋ฐฐ์ด์ ์๋ ๋ฃจ๋ํ์ ์์น๋ฅผ 0์ผ๋ก ํ์ํด์ค๋๋ค.
map[rudolf[0]][rudolf[1]]=0;
int nr = rudolf[0] + dr;
int nc = rudolf[1] + dc;
// 4. ์๋ก ์ด๋ํ ๋ฐฉํฅ์ ์ฐํ๊ฐ ์์ผ๋ฉด ์ถฉ๋์ ๊ตฌํํด์ค๋๋ค. (์ฌ๊ธฐ์ collision ์ถฉ๋ํจ์๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.)
if(map[nr][nc]!=0) {
int santa_num = map[nr][nc]; // ์ถฉ๋์ด ๋ฐ์ํ๋ ์ฐํ์ ๋ฒํธ
santas[santa_num].score += C;
santas[santa_num].stack = 2;
// ์ฌ๊ธฐ์ collision ์ถฉ๋ํจ์๋ฅผ ํธ์ถํฉ๋๋ค
collision(santa_num,dr,dc,C); // santa_num์ ์ฐํ๋ฅผ dr,dc ๋ฐฉํฅ์ผ๋ก C์นธ ๋งํผ ์ด๋
}
// 5. map๋ฐฐ์ด์ ์ด๋ํ ์์น์ ๋ฃจ๋ํ๋ฅผ ํ์ํด์ฃผ๊ณ , ๋ฃจ๋ํ์ ์ขํ๋ฅผ ์ ์ฅํ๋ rudolf ๋ฐฐ์ด ๊ฐ ๋ํ ๊ฐฑ์ ํด์ค๋๋ค.
map[nr][nc]=-1; // ๋ฃจ๋ํ ์ด๋
rudolf[0] = nr; // ๋ฃจ๋ํ ์ขํ ๊ฐฑ์
rudolf[1] = nc;
}
1. ๊ฐ์ฅ ๊ฐ๊น์ด ์ฐํ๋ฅผ ์ฐพ๋ ํจ์(find_nearest_santa)๋ฅผ ํธ์ถํฉ๋๋ค.
static Santa find_nearest_santa() {
PriorityQueue<Santa> pq = new PriorityQueue<>();
for(int p=1;p<=P;p++) {// ์ฐํ๋ค์ ๋ฃจ๋ํ ๊น์ง์ ๊ฑฐ๋ฆฌ ์
๋ฐ์ดํธ
if(santas[p].out) continue;
santas[p].updateDistance(rudolf[0],rudolf[1]);
pq.offer(santas[p]);
}
return pq.poll();
}
์ฐ์ ์์ ํ๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฐํ๋ฅผ ์ฐพ์์ต๋๋ค.
2. ์ฐพ์์ง ์ฐํ ๊ฐ์ฒด์ (r,c)๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฃจ๋ํ์ ๋ฐฉํฅ์ ์ค์ ํฉ๋๋ค.
์ด๋ ๋ฃจ๋ํ๋ 8๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์๊ธฐ๋๋ฌธ์ ์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ ํ์ ์์ด, ์ขํ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฐฉํฅ์ ์ ํ ์ ์์์ต๋๋ค.
3. map๋ฐฐ์ด์ ์๋ ๋ฃจ๋ํ์ ์์น๋ฅผ 0์ผ๋ก ํ์ํด์ค๋๋ค.
4. ์๋ก ์ด๋ํ ๋ฐฉํฅ์ ์ฐํ๊ฐ ์์ผ๋ฉด ์ถฉ๋์ ๊ตฌํํด์ค๋๋ค. (์ฌ๊ธฐ์ collision ์ถฉ๋ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.)
collisionํจ์
static void collision(int santa_num, int dr,int dc, int n) {
// 1. santa_num์ ํด๋นํ๋ ์ฐํ ๊ฐ์ฒด์ r,c ๊ฐ์ ์ด๋ ํ์ ๊ฐ์ผ๋ก ๊ฐฑ์ ํด์ฃผ๋ฉฐ, map๋ํ 0์ผ๋ก ํ์ํด์ค๋๋ค.
int r = santas[santa_num].r;
int c = santas[santa_num].c;
map[r][c] = 0; // ์๋์์น 0์ผ๋ก ํ์
int nr = r + dr*n;
int nc = c + dc*n;
santas[santa_num].r = nr;
santas[santa_num].c = nc;
// 2. ์ด๋ ๋ง์ฝ map์ ๋ฒ์ด๋๋ ์ขํ๋ผ๋ฉด santa ๊ฐ์ฒด์ out๊ฐ์ true๋ก ์ค์ ํด์ค๋๋ค.
if(nr<0 || nr>=N || nc<0 || nc>=N) {
santas[santa_num].out = true;
// 3. ์ด์์๋ ์ฐํ์ ๊ฐฏ์ ๋ํ -1 ์์ผ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ด์ ํจ์๋ฅผ ํ์ํ ํ์ ์์ด ์ข
๋ฃ์ํค๋ฉด ๋ฉ๋๋ค.
live_santa_cnt -= 1;
return;
}
// 4. ์ฐํ ๊ฐ์ฒด๊ฐ ์ด๋ํ ์์น์ ๋ ๋ค๋ฅธ ์ฐํ๊ฐ ์์นํด์๋ค๋ฉด, ์ฌ๊ท์ ์ผ๋ก collisionํจ์๋ฅผ ๋ค์ ํธ์ถํด์ค์ ์ํธ์์ฉ์ ๊ตฌํํฉ๋๋ค.
if(map[nr][nc]!=0) { // ๋ ๋ค๋ฅธ ์ฐํ๊ฐ ํด๋น ์์น์ ์์ผ๋ฉด dfs
collision(map[nr][nc],dr,dc,1);
}
// 5. map๋ฐฐ์ด์ ์ด๋ํ santa์ ๋ฒํธ๋ฅผ ๊ฐฑ์ ํด์ค๋๋ค.
map[nr][nc] = santa_num; //์ด๋ํ ์์น์ ์ฐํ๋ฒํธ ํ์
}
5. map๋ฐฐ์ด์ ์ด๋ํ ์์น์ ๋ฃจ๋ํ๋ฅผ ํ์ํด์ฃผ๊ณ , ๋ฃจ๋ํ์ ์ขํ๋ฅผ ์ ์ฅํ๋ rudolf ๋ฐฐ์ด ๊ฐ ๋ํ ๊ฐฑ์ ํด์ค๋๋ค.
์ฐํ๋ฅผ ์์ง์ด๋ ํจ์(move_santa)
static void move_santa() {
for(int p=1;p<=P;p++) {
Santa santa = santas[p];
if(santa.out || santa.stack>0) continue;
int dir = find_santa_dir(santa);
if(dir!=-1) { // ์์ง์ผ ๋ฐฉํฅ ์์ผ๋ฉด ์์ง์ด๊ธฐ
map[santa.r][santa.c]=0; // ์๋ ์์น 0์ผ๋ก ํ์
int nr = santa.r + dr[dir];
int nc = santa.c + dc[dir];
if(map[nr][nc]==-1) { // ํด๋น ์์น์ ๋ฃจ๋ํ๊ฐ ์์ผ๋ฉด ์ถฉ๋ ๋ฐ์
santa.score += D;
santa.stack = 2;
int rev_dir = (dir+2)%4; // ๋ฐ๋๋ฐฉํฅ
collision(p,dr[rev_dir],dc[rev_dir],D-1); // ์์ ์ด ์ด๋ํด์จ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก D์นธ ์ด๋
}else {
santa.r = nr;
santa.c = nc;
map[santa.r][santa.c]=p;
}
}
}
}
๋ด๋ถ์ ์ผ๋ก ์ฐํ๊ฐ ์์ง์ผ ์์น๋ฅผ ๊ฒฐ์ ํ find_santa_dir ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
์ด๋ํ ์์น์ ๋ฃจ๋ํ๊ฐ ์์ผ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ๋ฏ๋ก, collissionํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
์ด๋ ์ด๋๋ฐฉํฅ์ ๋ฐ๋๋ฐฉํฅ์ด๋ฏ๋ก (dir+2)%4 ์ฐ์ฐ์ ํตํด ๋ฐ๋๋ฐฉํฅ์ ๊ตฌํํ์์ผ๋ฉฐ, collissionํจ์์ ๋ง์ง๋ง ๋งค๊ฐ๋ณ์๋ D-1์ ๋๊ฒจ์ค์ผ ํฉ๋๋ค.
์๋ํ๋ฉด ์ฐํ๊ฐ ๋ฃจ๋ํ ์์น์์ D์นธ ์์ง์ฌ์ผ ํ๋๋ฐ, ํ์ฌ ์ฐํ ์์น๋ ๋ฃจ๋ํ ๋ฐ๋ก ์์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
find_santa_dir ํจ์
static int find_santa_dir(Santa santa) {
int dir = -1;
PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)->{
if(o1[0]==o2[0]) {
return (o1[1]-o2[1]);
}
return (o1[0]-o2[0]);
});
int r = santa.r;
int c = santa.c;
int origin_distance = (int)(Math.pow(r-rudolf[0],2) + Math.pow(c-rudolf[1], 2));
for(int d=0;d<4;d++) {
int nr = r + dr[d];
int nc = c + dc[d];
if(nr<0 || nr>=N) continue;
if(nc<0 || nc>=N) continue;
if(map[nr][nc]>0) continue; // ๋ค๋ฅธ ์ฐํ๊ฐ ์๋ ๊ฒฝ์ฐ
int distance = (int)(Math.pow(nr-rudolf[0],2) + Math.pow(nc-rudolf[1], 2));
if(distance < origin_distance) { // ์๋ ์์น๋ณด๋ค ๊ฐ๊น์ ์ง๋ ๊ฒฝ์ฐ์๋ง qp์ ๋ฃ์
pq.offer(new int[] {distance,d});
}
}
if(pq.size()>0) {
int[] result = pq.poll();
dir = result[1];
}
return dir;
}
์ฐ์ ์์ ํ๋ฅผ ํ์ฉํ์ฌ ์ต๋จ๊ฑฐ๋ฆฌ, ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ผ๋ฉด (์, ์ฐ, ํ, ์ข) ์์๋๋ก ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ์ต๋๋ค.
๊ธฐ์ ์คํ์ ์ค์ด๋ ํจ์(decrease_stack)
static void decrease_stack() {
for(int p=1;p<=P;p++) {
Santa santa = santas[p];
if(santa.stack>0) {
santa.stack -= 1;
}
}
}
๋งคํด ์ข ๋ฃ๋ง๋ค ํด๋น ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ธฐ์ ์ ์คํ๊ฐ์ผ๋ก ๋๊ฒจ์ค 2๋ฅผ 1์ฉ ๊ฐ์์ํต๋๋ค.. ์ฌ์ค ์ด ๋ถ๋ถ์ ๋ฌธ์ ์ ์์์์ ํํธ๋ฅผ ์ฃผ๊ณ ์์ต๋๋ค.
์ฐํ๋ค์ ์ ์๋ฅผ 1์ ์ฉ ์ฌ๋ ค์ฃผ๋ ํจ์(add_score)
static void add_score() {
for(int p=1;p<=P;p++) {
Santa santa = santas[p];
if(santa.out) continue;
santa.score += 1;
}
}
์ฐํ๊ฐ ๋ผ์ธ์์ ๋๊ฐ์ง ์์์ผ๋ฉด ์ ์๋ฅผ 1์ ์ฆ๊ฐ์ํต๋๋ค.
์๊ฒ๋์
- ํด๋น ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์๊ฒ๋ ์ ์ 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ฅผ ์ง์ ํ ๋นํ์ง ์์๋ ๋๋ค๋ ์ ์
๋๋ค.
int[][] map๊ณผ ๊ฐ์ด ๊ฐ์ฒด๋ค์ ๋ฒํธ๋ฅผ ํ ๋นํ๊ณ , ์ค์ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๋ฐฐ์ด์ ์ ์ฅํ์ฌ ๋งค์นญํ๋ ๋ฐฉ์์ผ๋ก ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ ์ ์์์ ์๊ฒ๋์์ต๋๋ค. - ๋ํ ์ฌ๋ฌ ์ฐ์ ์์๊ฐ ์ค์ฒฉ๋ ๊ฒฝ์ฐ ์ฐ์ ์์ํ๋ฅผ ์ ํ์ฉํด์ผ ๊ฒ ๋ค๊ณ ๋๊ผ์ต๋๋ค.
์ ์ฒด์ฝ๋
import java.util.*;
import java.io.*;
// 1. ๋ฃจ๋ํ ์์ง์ด๊ธฐ
// ๊ฐ์ฅ ๊ฐ๊น์ด ์ฐํ๋ฅผ ์ฐพ์์ผ ํจ (์ฐํ๋ค์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์์ด์ผ ํจ)
// ํด๋น ์์น๋ก ๋ฃจ๋ํ๋ฅผ 1์นธ ์ ์ง
// ์ฐํ์ ๋ฃจ๋ํ๊ฐ ์ถฉ๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ
// ์ด๋ ๋ฃจ๋ํ๋ผ๋ฆฌ ์ถฉ๋ํ๋ ๊ฒฝ์ฐ๋ ๊ตฌํ(์ํธ์์ฉ)
// 2. ์ฐํ ์์ง์ด๊ธฐ
// ๋ฃจ๋ํ์ ๊ฐ์ฅ ๊ฐ๊น์ ์ง๋ ๋ฐฉํฅ์ผ๋ก 1์นธ ์ด๋
// ๋ค๋ฅธ ์ฐํ๊ฐ ์๋ ์นธ์ ์์ง์ด์ง ๋ชปํจ
// ๋ฃจ๋ํ์ ๊ฐ๊น์ ์ง๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์์ง์ด์ง ์์
// ์ ์ฐ ํ ์ข ์ฐ์ ์์์ ๋ง์ถฐ ์์ง์
// ์ฐํ์ ๋ฃจ๋ํ๊ฐ ์ถฉ๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ
// ์ด๋ ๋ฃจ๋ํ๋ผ๋ฆฌ ์ถฉ๋ํ๋ ๊ฒฝ์ฐ๋ ๊ตฌํ(์ํธ์์ฉ)
class Santa implements Comparable<Santa>{
int r,c;
int d;
int score, stack;
boolean out;
public Santa(int r,int c) {
this.r = r;
this.c = c;
}
public void updateDistance(int r,int c) {
this.d = (int)(Math.pow(this.r-r,2) + Math.pow(this.c-c,2));
}
@Override
public int compareTo(Santa o) {
if(this.d==o.d) {
if(this.r==o.r) {
return -(this.c-o.c);
}
return -(this.r-o.r);
}
return (this.d-o.d);
}
}
public class Main {
static int N,M,P,C,D;
static int[][] map; // N*N, ์ฐํ๋ค์ ๋ฒํธ, ๋ฃจ๋ํ ํ์(-1)
static Santa[] santas; // 1๋ฒ ์ฐํ, 2๋ฒ ์ฐํ์ ์ ๋ณด๋ฅผ ์ ์ฅ
static int[] rudolf; // ๋ฃจ๋ํ์ ์ขํ
static int[] dr = {-1,0,1,0};
static int[] dc = {0,1,0,-1};
static int live_santa_cnt;
static Santa find_nearest_santa() {
PriorityQueue<Santa> pq = new PriorityQueue<>();
for(int p=1;p<=P;p++) {// ์ฐํ๋ค์ ๋ฃจ๋ํ ๊น์ง์ ๊ฑฐ๋ฆฌ ์
๋ฐ์ดํธ
if(santas[p].out) continue;
santas[p].updateDistance(rudolf[0],rudolf[1]);
pq.offer(santas[p]);
}
return pq.poll();
}
static void collision(int santa_num, int dr,int dc, int n) {
int r = santas[santa_num].r;
int c = santas[santa_num].c;
map[r][c] = 0; // ์๋์์น 0์ผ๋ก ํ์
int nr = r + dr*n;
int nc = c + dc*n;
santas[santa_num].r = nr;
santas[santa_num].c = nc;
if(nr<0 || nr>=N || nc<0 || nc>=N) {
santas[santa_num].out = true;
live_santa_cnt -= 1;
return;
}
if(map[nr][nc]!=0) { // ๋ ๋ค๋ฅธ ์ฐํ๊ฐ ํด๋น ์์น์ ์์ผ๋ฉด dfs
collision(map[nr][nc],dr,dc,1);
}
map[nr][nc] = santa_num; //์ด๋ํ ์์น์ ์ฐํ๋ฒํธ ํ์
}
static void move_rudolf() {
Santa finded_santa = find_nearest_santa();
int dc = 0;
if(rudolf[1]>finded_santa.c) {
dc = -1;
}else if(rudolf[1]<finded_santa.c) {
dc = 1;
}
int dr = 0;
if(rudolf[0]>finded_santa.r) {
dr = -1;
}else if(rudolf[0]<finded_santa.r) {
dr = 1;
}
map[rudolf[0]][rudolf[1]]=0; // ์๋ ์์น 0์ผ๋ก ํ์
int nr = rudolf[0] + dr;
int nc = rudolf[1] + dc;
if(map[nr][nc]!=0) { // ์ฐํ๊ฐ ์์ผ๋ฉด ์ถฉ๋ ๋ฐ์
int santa_num = map[nr][nc]; // ์ถฉ๋์ด ๋ฐ์ํ๋ ์ฐํ์ ๋ฒํธ
santas[santa_num].score += C;
santas[santa_num].stack = 2;
collision(santa_num,dr,dc,C); // santa_num์ ์ฐํ๋ฅผ dr,dc ๋ฐฉํฅ์ผ๋ก C์นธ ๋งํผ ์ด๋
}
map[nr][nc]=-1; // ๋ฃจ๋ํ ์ด๋
rudolf[0] = nr; // ๋ฃจ๋ํ ์ขํ ๊ฐฑ์
rudolf[1] = nc;
}
static int find_santa_dir(Santa santa) {
int dir = -1;
PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)->{
if(o1[0]==o2[0]) {
return (o1[1]-o2[1]);
}
return (o1[0]-o2[0]);
});
int r = santa.r;
int c = santa.c;
int origin_distance = (int)(Math.pow(r-rudolf[0],2) + Math.pow(c-rudolf[1], 2));
for(int d=0;d<4;d++) {
int nr = r + dr[d];
int nc = c + dc[d];
if(nr<0 || nr>=N) continue;
if(nc<0 || nc>=N) continue;
if(map[nr][nc]>0) continue; // ๋ค๋ฅธ ์ฐํ๊ฐ ์๋ ๊ฒฝ์ฐ
int distance = (int)(Math.pow(nr-rudolf[0],2) + Math.pow(nc-rudolf[1], 2));
if(distance < origin_distance) { // ์๋ ์์น๋ณด๋ค ๊ฐ๊น์ ์ง๋ ๊ฒฝ์ฐ์๋ง qp์ ๋ฃ์
pq.offer(new int[] {distance,d});
}
}
if(pq.size()>0) {
int[] result = pq.poll();
dir = result[1];
}
return dir;
}
static void move_santa() {
for(int p=1;p<=P;p++) {
Santa santa = santas[p];
if(santa.out || santa.stack>0) continue;
int dir = find_santa_dir(santa);
if(dir!=-1) { // ์์ง์ผ ๋ฐฉํฅ ์์ผ๋ฉด ์์ง์ด๊ธฐ
map[santa.r][santa.c]=0; // ์๋ ์์น 0์ผ๋ก ํ์
int nr = santa.r + dr[dir];
int nc = santa.c + dc[dir];
if(map[nr][nc]==-1) { // ํด๋น ์์น์ ๋ฃจ๋ํ๊ฐ ์์ผ๋ฉด ์ถฉ๋ ๋ฐ์
santa.score += D;
santa.stack = 2;
int rev_dir = (dir+2)%4; // ๋ฐ๋๋ฐฉํฅ
collision(p,dr[rev_dir],dc[rev_dir],D-1); // ์์ ์ด ์ด๋ํด์จ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก D์นธ ์ด๋
}else {
santa.r = nr;
santa.c = nc;
map[santa.r][santa.c]=p;
}
}
}
}
static void decrease_stack() {
for(int p=1;p<=P;p++) {
Santa santa = santas[p];
if(santa.stack>0) {
santa.stack -= 1;
}
}
}
static void add_score() {
for(int p=1;p<=P;p++) {
Santa santa = santas[p];
if(santa.out) continue;
santa.score += 1;
}
}
static void start() {
for(int m=0;m<M;m++) {
move_rudolf();
move_santa();
decrease_stack();
add_score();
if(live_santa_cnt==0) {
return;
}
}
}
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());
M = Integer.parseInt(st.nextToken());
P = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
D = Integer.parseInt(st.nextToken());
map = new int[N][N];
santas = new Santa[P+1];
rudolf = new int[2];
live_santa_cnt = P;
st = new StringTokenizer(br.readLine());
for(int i=0;i<2;i++) {
rudolf[i] = Integer.parseInt(st.nextToken())-1;
}
map[rudolf[0]][rudolf[1]] = -1; // ๋ฃจ๋ํ๋ -1
for(int p=0;p<P;p++) {
st = new StringTokenizer(br.readLine());
int num,row,col;
num = Integer.parseInt(st.nextToken());
row = Integer.parseInt(st.nextToken())-1;
col = Integer.parseInt(st.nextToken())-1;
map[row][col] = num;
santas[num] = new Santa(row,col);
}
start();
for(int p=1;p<=P;p++) {
System.out.print(santas[p].score+" ");
}
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[PCCP ๊ธฐ์ถ๋ฌธ์ ] 2๋ฒ / ์์ ์์ถ (0) | 2024.04.30 |
---|---|
์์ค์ ๊ธฐ์ฌ ๋๊ฒฐ(์ผ์ฑ sw์ญ๋ํ ์คํธ) (0) | 2024.04.12 |
[๋ฐฑ์ค] ์ํ ๋๋ฆฌ๊ธฐ (0) | 2024.04.09 |
[๋ฐฑ์ค] ์ฐ๊ตฌ์ 3 (์กฐํฉ, bfs) (0) | 2024.04.07 |
๋ฐฐ์ด ์๊ณ๋ฐฉํฅ ํ์ ๊ณต์ (1) | 2024.04.06 |