⨠ꡬν β‘οΈ μ°μμ μΌλ‘ μ΄λμν€κΈ° & μ΄λν μ’ν κ°±μ νκ³ μ λ°μμν€κΈ°
μ½λνΈλ¦¬ | μ½λ©ν μ€νΈ μ€λΉλ₯Ό μν μκ³ λ¦¬μ¦ μ μ
κ΅κ°λνκ° λ§λ μ½λ© 곡λΆμ κ°μ΄λλΆ μ½λ© μμ΄λ³΄λΆν° κΏμ μ§μ₯ μ½ν ν©κ²©κΉμ§, κ΅κ°λνκ° μμ ν 컀리νλΌμΌλ‘ μ€λΉν΄λ³΄μΈμ.
www.codetree.ai
πκ³ λ €ν΄μΌν μ
- μ°νκ° κ°κΉμ΄ 루λνμκ² μ΄λν λ, λ°λλ‘ λ£¨λνκ° κ°κΉμ΄ μ°νμκ² μ΄λν λ μ΄λ λ°©ν₯μΌλ‘ μ΄λν μ§ κ²°μ νκΈ° μν΄μλ 거리 곡μ κ³μ°μ μ΄μ©ν΄μ λΉκ΅ν΄μΌ νλ€.
π 루λνμ κ²½μ° 8λ°©ν₯ μ΄λ κ°λ₯νκ³ , μ°νλ 4λ°©ν₯λ§ μ΄λμ΄ κ°λ₯νλ€. μ΄λ κ°λ₯ν λ°©ν₯μ λν΄ μ λΆ νμνμ¬ μ μΌ κ°κΉμ΄ 거리λ₯Ό μ°Ύλλ€. - μ°νλ μ΄λν κ²½μ°κ° μ¬λ¬ κ°λΌλ©΄ μ, μ°, ν, μ’ λ°©ν₯ μ°μ μμμ λ§μΆ° μ΄λνλ€. π 루λνλ μ΄λν κ²½μ°κ° 1κ°λ§ λμ¬ κ²μ΄λ€.
- μ°νμ κ²½μ° μ΄λ κ°λ₯νμ§λ§ νμ¬ μμΉν΄ μλ κ³³μ΄ κ°μ₯ κ°κΉμ΄ 거리λΌλ©΄ μ¦, 루λνλ‘λΆν° κ°κΉμμ§ μ μλ λ°©λ²μ΄ μλ€λ©΄ μ΄λνμ§ μλλ€.
- 루λνμ μΆ©λν μ°νκ° μνΈμμ©μΌλ‘ λ€λ₯Έ μΉΈμ μ°©μ§νλ €κ³ ν λ μ΄λ―Έ κ·Έ μΉΈμ λ€λ₯Έ μ°νκ° μ‘΄μ¬νλ©΄ μ°μμ μΌλ‘ 1μΉΈμ© μ΄λνλ€.
- 루λνμ μΆ©λν μ°νλ κΈ°μ ν΄ 1λ² ν΄μ μ°λ€. κΈ°μ ν μ°νλ μ΄λν μ μλ€.
- μ€κ° μ€κ° μ΄λν μμΉλ₯Ό κ°±μ νκ³ μ μ₯ν΄μΌνλ€ ! π μ€μ λ‘ μ΄ λΆλΆμ λΉ λ¨λ¦¬κ³ μμ±ν κ³³μ΄ λͺ κ΅°λ° μμ΄μ λλ²κΉ νλ©΄μ μ λ₯Ό λ¨Ήμλ€....
πΉοΈ νμ΄ λ°©λ²
μꡬμ¬νλλ‘ μ°¨κ·Όμ°¨κ·Ό νλ©΄ λλ€.
1οΈβ£ μλ£κ΅¬μ‘° μ ν
μ°νμ μμΉμ κΈ°μ μ¬λΆμ λν μμλ€μ νλμ classλ‘ λ§λ€μκ³ ,
μ°νμ μμ‘΄ μ¬λΆ boolean[]
μ νμ¬ μ°νμ μ 보 Info[]
λ₯Ό μ μ₯ν λ°°μ΄μ λ§λ€μλ€.
μ°νμ 루λνμ μμΉλ₯Ό λ°μμν¬ board[][]
λ°°μ΄λ λ§λ€μλ€. μ΄ λ°°μ΄μλ μ°νμ λ²νΈ(1~P)μ 루λν(-1)μ κ°±μ ν΄κ°λ©΄μ λ°μμν¬ κ²μ΄λ€.
κΈ°μ ν μμλ z=2λ‘ μ€μ νκ³ ν΄μ΄ λλ λλ§λ€ zκ° 1μ© κ°μνλλ‘ νμ¬ z=0μ΄ λλ©΄ λ€μ μ΄λν μ μκ² ν΄ μ€ κ²μ΄λ€.
μ΄ μΈμ νΉλ³ν 건 λ±ν μλ€.
2οΈβ£ 루λνμ μμ§μ - moveR()
- κ°μ₯ κ°κΉμ΄ μ°νλ₯Ό μ°ΎκΈ° μν΄ μ΄μμλ λͺ¨λ μ°νμμ 거리λ₯Ό κ³μ°νλ€.
- κ°μ₯ κ°κΉμ΄ μ°νλ₯Ό μ°Ύμλ€λ©΄ μ΄λν μ μλ 8λ°©ν₯ μ€ μ°Ύμ μ°νμ κ°μ₯ κ°κΉκ² μ΄λν μ μλ λ°©ν₯μ λͺ¨λ κ³μ°νμ¬ μ°Ύλλ€.
- λ§μ½ μ΄λνλ €λ κ³³μ μ°νκ° μλ€λ©΄ μ°νμ μΆ©λνλ€.
- 루λνκ° μμ§μ¬μ μΆ©λμ΄ μΌμ΄λ κ²½μ°μ΄λ―λ‘
collideWithSanta()
λ©μλλ₯Ό νΈμΆνλ€.
- νμ¬ λ£¨λνμ λ°©ν₯κ³Ό μμΉ, ν΄λΉνλ μΉΈμ μμΉνλ μ°νμ λ²νΈλ₯Ό 맀κ°λ³μλ‘ λ겨μ€λ€.
- μ°νλ Cλ§νΌ μ μλ₯Ό νλνλ©° λμμ 루λνμ λ°©ν₯λλ‘ CμΉΈλ§νΌ λ°λ €λλ€.
- λ°λ €λ μΉΈμ΄ λ²μ λ°μ΄λΌλ©΄ μ°νλ νλ½νλ€.
- λ°λ €λ μΉΈμ λ€λ₯Έ μ°νκ° μ‘΄μ¬νλ©΄ μνΈμμ©
interact()
μ΄ λ°μνλ€.- λ€λ₯Έ μ°νλ 1μΉΈ ν΄λΉ λ°©ν₯μΌλ‘ λ°λ €λκ°κ³ μ΄λν μΉΈμ λ μ°νκ° μ‘΄μ¬νλ©΄ μ°μμ μΌλ‘ 1μΉΈμ© λ°λ €λλ κ²μ λ°λ³΅νλ€.
3οΈβ£ μ°νμ μμ§μ - moveS()
루λνμ μμ§μκ³Ό λΉμ·νλ€.
λ€λ§ λ€μ λ€λ₯Έ 쑰건λ€μ΄ μμ΄μ μ΄ λΆλΆμ μ κ³ λ €ν΄μ μ½λλ₯Ό μμ±νλ©΄ λλ€.
4οΈβ£ μΆ©λ - collideWithSanta()
, collideWithR()
μ°νκ° μ μλ₯Ό νλνκ³ , κΈ°μ μ¬λΆμ λν μ 보λ₯Ό μμ§ λ§κ³ μμ±νλ©΄ λλ€.
λ°λ €λ μΉΈμ λ€λ₯Έ μ°νκ° μμ κ²½μ° μνΈμμ© ν¨μλ₯Ό νΈμΆνλ€.
5οΈβ£ μνΈμμ© - interact()
νλνλ swapμν€λ ννλ‘ μμ±νλ€.
λ§μ½ μ΄λνλ €λ μΉΈμ μ무λ μλ€λ©΄ λμ΄μ λ°λ €λ μ°νκ° μμΌλ―λ‘ breakνλ©΄ λλ€.
μ£Όμν μ μ μ΄λνκ³ λμμ μ 보λ₯Ό κ°±μ νκ³ μ λ°μν΄μΌ νλ€ !!
π©π» μ 체 μ½λ
public class final_2023_1_루λνμλ°λ {
static int N, M, P, C, D;
static int rx, ry; // 루λν μμΉ
static boolean[] santaDie; // μ°ν μμ‘΄ μ¬λΆ
static Info[] santa;
static int[][] board;
static int[][] newBoard;
static int[] score;
static int santaTargetX, santaTargetY;
static int[] dx = {-1, 0, 1, 0, -1, -1, 1, 1}; // μμ°νμ’, κ·Έλ€μ λκ°μ
static int[] dy = {0, 1, 0, -1, -1, 1, 1, -1};
static class Info{
int x, y, z;
public Info(int x, int y, int z) {
this.x=x;
this.y=y;
this.z=z; // κΈ°μ ν κ²½μ° μ¬μ΄μΌν ν΄ νμ
}
}
static void simulate() {
moveR();
moveS();
}
// #1. 루λν μμ§μ
static void moveR(){
int min=Integer.MAX_VALUE;
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(board[i][j]>0) {
Info s = santa[board[i][j]];
int len = (int) (Math.pow(s.x-rx,2) + Math.pow(s.y-ry, 2));
if(len<=min) {
min = len;
santaTargetX = s.x;
santaTargetY = s.y;
}
}
}
}
min=Integer.MAX_VALUE;
int nrx=0, nry=0, nd=0;
// κ°μ₯ κ°κΉμ΄ μ°ν μͺ½μΌλ‘ μ΄λ (8λ°©ν₯ μ€ 1λ°©ν₯ μ ν)
for(int i=0; i<8; i++) {
int nx = rx+dx[i];
int ny = ry+dy[i];
if(nx<0 || ny<0 || nx>=N || ny>=N) continue;
int len = (int) (Math.pow(santaTargetX-nx,2) + Math.pow(santaTargetY-ny, 2));
if(len<min) {
min = len;
nrx = nx;
nry = ny;
nd = i;
}
}
// μ΄λνλ €λ κ³³μ μ°νκ° μλ€λ©΄ μ°νμ μΆ©λ --> μ°νλ 루λν λ°©ν₯μΌλ‘ λ°λ €λ¨
if(board[nrx][nry]>0) {
collideWithSanta(nd, nrx, nry, board[nrx][nry]);
}
board[rx][ry] = 0; // νμ¬ λ£¨λν μμΉμ 루λν νμ μ κ±°
// 루λν μ΄λ μλ£
rx = nrx;
ry = nry;
board[rx][ry] = -1; // μ΄λνλ €λ μμΉμ 루λν νμ μΆκ°
}
// #2. μ°ν μμ§μ
static void moveS() {
int min;
int nsx=0, nsy=0, nd=0;
int nx, ny;
// κΈ°μ νμ§ μκ±°λ νλ½νμ§ μμ μ°ν μ΄λ
for(int i=1; i<=P; i++) {
Info s = santa[i];
nx = s.x;
ny = s.y;
// len = μ°ν νμ¬ μμΉλΆν° 루λνκΉμ§μ 거리
int len = (int) (Math.pow(nx-rx, 2) + Math.pow(ny-ry, 2));
min = len;
if(s.z>0 || santaDie[i]) continue;
for(int d=0; d<4; d++) {
nx = s.x+dx[d];
ny = s.y+dy[d];
if(nx<0 || ny<0 || nx>=N || ny>=N || board[nx][ny]>0) continue;
int nlen = (int) (Math.pow(rx-nx,2) + Math.pow(ry-ny, 2));
if(nlen<min) {
min = nlen;
nsx = nx;
nsy = ny;
nd = d;
}
}
if(nx==s.x && ny==s.y) continue;
if(min==len) continue; // μμ§μΌ μ μλ μΉΈμ΄ μλλΌλ λ§μ½ 루λνλ‘λΆν° κ°κΉμμ§ μ μλ λ°©λ²μ΄ μλ€λ©΄ μ°ν μ΄λ X
board[s.x][s.y]=0; // μ°νκ° μμλ κ³³ 0μΌλ‘ λ§λ€κΈ°
// μ΄λνλ €λ κ³³μ 루λνκ° μλ€λ©΄ 루λνμ μΆ©λ --> μ°νλ λ°λλ°©ν₯μΌλ‘ λ°λ €λ¨
if(board[nsx][nsy]==-1) {
collideWithR(nd, nsx, nsy, i);
continue;
}
// μ°ν μ΄λ μλ£
s.x = nsx;
s.y = nsy;
board[s.x][s.y]=i; // μ°ν μ΄λν κ³³μ νμ
}
}
// #3-1. 루λν -> μ°ν μΆ©λ
static void collideWithSanta(int d, int x, int y, int n) {
score[n]+=C; // μ°νλ Cλ§νΌ μ μ νλ
santa[n].z=2; // μ°ν κΈ°μ
// μ°νλ 루λνκ° μ΄λν΄μ¨ λ°©ν₯μΌλ‘ CμΉΈ λ§νΌ λ°λ €λ¨
int nsx = x+dx[d]*C;
int nsy = y+dy[d]*C;
// λ§μ½ λ°λ €λ μμΉκ° κ²μν λ°μ΄λΌλ©΄ μ°νλ νλ½
if(nsx<0 || nsy<0 || nsx>=N || nsy>=N) {
santaDie[n]=true;
return;
}
// λ§μ½ λ°λ €λ μΉΈμ λ€λ₯Έ μ°νκ° μλ κ²½μ° μνΈμμ© λ°μ
if(board[nsx][nsy]>0) interact(d, nsx, nsy, board[nsx][nsy]);
santa[n].x = nsx;
santa[n].y = nsy;
board[nsx][nsy] = n;
}
// #3-2. μ°ν -> 루λν μΆ©λ
static void collideWithR(int d, int x, int y, int n) {
score[n]+=D; // μ°νλ Dλ§νΌ μ μ νλ
santa[n].z=2; // μ°ν κΈ°μ
// μ°νλ λ³ΈμΈμ΄ μ΄λν΄ μ¨ λ°λ λ°©ν₯μΌλ‘ DμΉΈ λ§νΌ λ°λ €λ¨
if(d==0 || d==1) d+=2;
else d-=2;
int nsx = x+dx[d]*D;
int nsy = y+dy[d]*D;
// λ§μ½ λ°λ €λ μμΉκ° κ²μν λ°μ΄λΌλ©΄ μ°νλ νλ½
if(nsx<0 || nsy<0 || nsx>=N || nsy>=N) {
santaDie[n]=true;
return;
}
// λ§μ½ λ°λ €λ μΉΈμ λ€λ₯Έ μ°νκ° μλ κ²½μ° μνΈμμ© λ°μ
if(board[nsx][nsy]>0) {
interact(d, nsx, nsy, board[nsx][nsy]);
}
santa[n].x = nsx;
santa[n].y = nsy;
board[nsx][nsy] = n;
}
// #4. μνΈμμ© : μΆ©λν μ°νλ 1μΉΈμ© λ°λ¦¬κ² λ¨ -> μ°μμ μΌλ‘ 1μΉΈ μ΄λ λ°λ³΅
static void interact(int d, int x, int y, int n) {
while(true) {
Info s = santa[n];
int nx=s.x+dx[d];
int ny=s.y+dy[d];
if(nx<0 || ny<0 || nx>=N || ny>=N) {
santaDie[n]=true;
break;
}
if(board[nx][ny]>0) {
int tmp = board[nx][ny];
board[nx][ny]=n;
n = tmp;
s.x=nx;
s.y=ny;
}
else if(board[nx][ny]==0) {
board[nx][ny] = n;
s.x = nx;
s.y = ny;
break;
}
}
}
// μ΄μμλ μ°ν μ μ νλ
static void getScore() {
for(int i=1; i<santa.length; i++) {
if(!santaDie[i]) score[i]++;
}
}
// κΈ°μ ν μ°ν ν볡
static void recovery() {
for(int i=1; i<santa.length; i++) {
if(!santaDie[i] && santa[i].z>0) santa[i].z--;
}
}
// μ΄μμλ μ°ν μ νμΈ
static int checkSanta() {
int cnt=0;
for(int i=1; i<santa.length; i++) {
if(!santaDie[i]) cnt++;
}
return cnt;
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
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()); // μ°ν ν
board = new int[N][N];
newBoard = new int[N][N];
santa = new Info[P+1];
score = new int[P+1];
santaDie = new boolean[P+1];
st = new StringTokenizer(br.readLine());
rx = Integer.parseInt(st.nextToken())-1; // 루λν μμΉ
ry = Integer.parseInt(st.nextToken())-1;
board[rx][ry]=-1;
for(int i=1; i<=P; i++) {
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken())-1;
int y = Integer.parseInt(st.nextToken())-1;
santa[n] = new Info(x, y, 0);
board[x][y]=n;
}
while(M-->0) {
simulate();
getScore();
if(checkSanta()==0) break;
// ν ν΄μ΄ λλ λλ§λ€ κΈ°μ ν μ°ν ν볡
recovery();
}
for(int i=1; i<=P; i++) {
bw.write(score[i] + " ");
}
bw.flush();
bw.close();
}
}
'μκ³ λ¦¬μ¦ > CodeTree' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[CodeTree] λ©μ΄μ¦ λ¬λ - Java (1) | 2024.04.12 |
---|---|
[CodeTree] μΈμλ - Java (0) | 2024.03.24 |