โจ ๊ตฌํ ๐ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ฅ ์์ ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ ์ฐพ๊ณ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์
์ฝ๋ํธ๋ฆฌ | ์ฝ๋ฉํ ์คํธ ์ค๋น๋ฅผ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ ์
๊ตญ๊ฐ๋ํ๊ฐ ๋ง๋ ์ฝ๋ฉ ๊ณต๋ถ์ ๊ฐ์ด๋๋ถ ์ฝ๋ฉ ์์ด๋ณด๋ถํฐ ๊ฟ์ ์ง์ฅ ์ฝํ ํฉ๊ฒฉ๊น์ง, ๊ตญ๊ฐ๋ํ๊ฐ ์์ ํ ์ปค๋ฆฌํ๋ผ์ผ๋ก ์ค๋นํด๋ณด์ธ์.
www.codetree.ai
๐ ๊ณ ๋ คํด์ผํ ์
- ์ฐธ๊ฐ์๊ฐ ํ์ฌ ์๋ ์นธ ~ ์ถ๊ตฌ๊น์ง์ ๊ฑฐ๋ฆฌ < ์ฐธ๊ฐ์๊ฐ ์ด๋ํ ์นธ ~ ์ถ๊ตฌ๊น์ง์ ๊ฑฐ๋ฆฌ โ ์ด๋ X
- ์ถ๊ตฌ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๋ ๊ฐ๊น์์ผ ์ด๋ ๊ฐ๋ฅ
- ์์ง์ผ ์ ์๋ ์นธ์ด 2๊ฐ ์ด์์ด๋ผ๋ฉด ์ํ๋ก ์์ง์ด๋ ๊ฒ์ ์ฐ์ ์
- ํ ์นธ์ 2๋ช ์ด์์ ์ฐธ๊ฐ์ ์์ด๋ ๊ฐ๋ฅ ๐ List<Integer>[][] peopleLoc;
- ํ ๋ช
์ด์์ ์ฐธ๊ฐ์์ ์ถ๊ตฌ๋ฅผ ํฌํจํ ๊ฐ์ฅ ์์ ์ ์ฌ๊ฐํ ์ฐพ๊ธฐ
- ๊ทธ๋ฌํ ์ ์ฌ๊ฐํ์ด 2๊ฐ ์ด์์ด๋ผ๋ฉด ํ์ด ์์ ๊ฒ์ด ์ฐ์ , ๊ทธ๋๋ ๊ฐ์ผ๋ฉด ์ด์ด ์์ ๊ฒ์ด ์ฐ์
- ์ ํ๋ ์ ์ฌ๊ฐํ์ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ๋ฉฐ ํ์ ๋ ๋ฒฝ์ ๋ด๊ตฌ๋-1
๐น๏ธ ํ์ด๋ฐฉ๋ฒ
์กฐ๊ฑด์ ์ ํฉํ ๊ฒ์ด ์ฌ๋ฌ ๊ฐ ์์ ๋ ์ฐ์ ๋๋ ๊ฒ๋ค์ ์ ํํด์ผํ๊ณ ,
๊ฐ์ฅ ์์ ์ ์ฌ๊ฐํ์ ์ฐพ๋ ๊ฒ๊ณผ ์ ์ฌ๊ฐํ์ 90๋ ํ์ ํ๋ ์ฝ๋๋ฅผ ์ ์ํด์ ์์ฑํด์ผ ํ๋ค. ๐ ์ด ๋ถ๋ถ์์ ์๊ฐ์ด ๊ฝค ๊ฑธ๋ ธ๋ค.
๐ธ ๊ฐ์ฅ ์์ ์ ์ฌ๊ฐํ ์ฐพ๊ธฐ
๊ฐ์ฅ ์์ ์ ์ฌ๊ฐํ์ ์ฐพ๋ ๊ฒ์ ๋จ์ํ๋ค.
์ฐธ๊ฐ์ 1๋ช ์ด์๊ณผ ์ถ๊ตฌ๋ฅผ ํฌํจํ๋ ์ ์ฌ๊ฐํ์ด๋ฏ๋ก ํ ๋ณ์ ๊ธธ์ด๋ ์ต์ 2์ด์ด์ผ ํ๋ค.
์ ์ฌ๊ฐํ์ ํ ๋ณ์ ๊ธธ์ด๊ฐ sn์ด๋ผ๊ณ ํ ๋, (0, 0)์นธ ๋ถํฐ (N-sn, N-sn)์นธ๊น์ง ์ ์ฌ๊ฐํ์ ์ผ์ผ์ด ๋ง๋ค๋ฉด์
ํด๋นํ๋ ์ ์ฌ๊ฐํ ์์ ์ฐธ๊ฐ์์ ์ถ๊ตฌ๊ฐ ํฌํจ๋๋์ง๋ฅผ ํ์ธํ๋ฉด ๋๋ค.
๊ฐ์ฅ ์์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ ธ์ผํ๊ณ , ํฌ๊ธฐ๊ฐ ๋์ผํ๋ค๋ฉด ํ์ด ์์ ๊ฒ, ๊ทธ๋๋ ๊ฐ์ผ๋ฉด ์ด์ด ์์ ๊ฒ์ ์ ํํด์ผํ๊ธฐ ๋๋ฌธ์ ์ฐ์ ํ ๋ณ์ ๊ธธ์ด๊ฐ 2์ผ ๋๋ถํฐ ์์ฐจ์ ์ผ๋ก ํ์ํ๋ค.
์ ์ฌ๊ฐํ์ด ์์ํ๋ ์นธ์ ํ์ํ๋ฉด์ ์ฐธ๊ฐ์์ ์ถ๊ตฌ๋ฅผ ํฌํจํ๋ค๋ ์กฐ๊ฑด์ ๋ถํฉํ๋ ์ ์ฌ๊ฐํ์ด ๋์ค๋ฉด ๋ฐ๋ก ์ ์ฒด ๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ๋์ค๋๋ก ์์ฑํด์ผ ํ์ ์ํฌ ์ ์๋ ์ ์ฌ๊ฐํ์ ๊ตฌํ ์ ์๋ค.
๐ธ ์ ์ฌ๊ฐํ ํ์ ์ํค๊ธฐ
์ ์ฌ๊ฐํ ํฌ๊ธฐ์ ์์์ ๋ฐฐ์ด์ ์์ฑํด์ ํ์ ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ฃ๊ณ ๋ค์ maze๋ฐฐ์ด์ ๋ฐ์์ํค๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ๋ค.
์ฐธ๊ฐ์๋ ํ ์นธ์ ์ฌ๋ฌ ๋ช ์์ ์ ์์ผ๋ฏ๋ก ์ฐธ๊ฐ์๋ค์ ์์น์ ๋ณด์ ํ์ถ์ฌ๋ถ๋ฅผ ํฌํจํ Info[] people๊ณผ
์ฐธ๊ฐ์๋ค์ ์์น๋ฅผ ์ฐธ๊ฐ์์ ๋ฒํธ๋ก ์ ์ฅํ List<Integer>[][] peopleLoc ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ค.
์ ์ฌ๊ฐํ ๋ฒ์์ ์ฐธ๊ฐ์ ๋ฒํธ๊ฐ ํฌํจ๋๋ฉด ๊ทธ ์ฐธ๊ฐ์์ ์์น๋ฅผ ํ์ ์ํค๊ณ ๋์ค์ putPeople() ๋ฉ์๋๋ฅผ ํตํด peopleLoc์ ๋ฐ์์์ผ์ค ๊ฒ์ด๋ค.
๐น move() : ์ฐธ๊ฐ์ ์ด๋์ํค๊ธฐ
// ์ฐธ๊ฐ์ ํ ์นธ์ฉ ์ด๋ --> ์ถ๊ตฌ๊น์ง ๊ฐ๊น์์ ธ์ผ ํจ --> ์์ง์ผ ์ ์๋ ์นธ์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์ํ ์ฐ์ ์
static void move() {
for(int i=1; i<=M; i++) {
Info p = people[i];
int npx=0, npy=0;
// ํ์ฌ ์์น์์ ์ถ๊ตฌ๊น์ง์ ๊ฑฐ๋ฆฌ
int minDist = Math.abs(p.x-exitX)+ Math.abs(p.y-exitY);
// ๋ง์ฝ ์ฐธ๊ฐ์๊ฐ ์ด๋ฏธ ํ์ถํ์ผ๋ฉด ๋ฉ์๋ ๋์ํ ํ์ X
if(!p.escaped) {
for(int d=0; d<4; d++) {
int nx = p.x+dx[d];
int ny = p.y+dy[d];
// ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ๋ฒฝ์ด ์์ผ๋ฉด ์ด๋ ๋ถ๊ฐ
if(inRange(nx, ny) && (maze[nx][ny]==0||maze[nx][ny]==-1)) {
// ํ์ฌ ์์น๋ณด๋ค ์ด๋ํ ์์น๊ฐ ์ถ๊ตฌ์ ๋ ๊ฐ๊น์ด์ง ํ์ธ
int nDist = Math.abs(nx-exitX)+ Math.abs(ny-exitY);
if(nDist<minDist) {
minDist = nDist;
npx = nx;
npy = ny;
}
}
}
}
// ํ์ฌ ์์น๋ณด๋ค ๋ ๊ฐ๊น๊ฒ ์ด๋ํ ์ ์๋ค๋ฉด ์ด๋ X
if(minDist == Math.abs(p.x-exitX)+ Math.abs(p.y-exitY))continue;
// ์ด๋ ๊ฐ๋ฅํ๋ค๋ฉด ์ด๋ํ์ 1 ์ฆ๊ฐ
moveDist++;
// ์ฐธ๊ฐ์ ์์น ๋ณํ
p.x = npx;
p.y = npy;
// ์ถ๊ตฌ์ ๋์ฐฉํ๋ค๋ฉด ํ์ถ
if(p.x==exitX && p.y==exitY) p.escaped=true;
}
}
๐น findSquare() : ํ ๋ช ์ด์์ ์ฐธ๊ฐ์์ ์ถ๊ตฌ๋ฅผ ํฌํจํ ๊ฐ์ฅ ์์ ์ ์ฌ๊ฐํ ์ฐพ๊ธฐ
// ํ ๋ช
์ด์์ ์ฐธ๊ฐ์์ ์ถ๊ตฌ๋ฅผ ํฌํจํ ๊ฐ์ฅ ์์ ์ ์ฌ๊ฐํ ์ฐพ๊ธฐ
// ๊ฐ์ฅ ์์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ์ ์ฌ๊ฐํ์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์ข์๋จ x ์ขํ๊ฐ ์์ ๊ฒ์ด ์ฐ์ , ๊ทธ๋๋ ๊ฐ์ผ๋ฉด y ์ขํ๊ฐ ์์ ๊ฒ์ด ์ฐ์
static void findSquare() {
boolean isPeople = false; // ์ฐธ๊ฐ์ ํฌํจ ์ฌ๋ถ
boolean isExit = false; // ์ถ๊ตฌ ํฌํจ์ฌ๋ถ
// ์ ์ฌ๊ฐํ์ ์ฐพ์๋ค๋ฉด break loop์ ํตํด ์ ์ฒด ๋ฐ๋ณต๋ฌธ ๋น ์ ธ๋์ค๊ธฐ
loop:
// ํ ๋ณ์ ๊ธธ์ด (์ต์ ๊ธธ์ด=2)
for(int n=2; n<=N; n++) {
// ์ ์ฌ๊ฐํ์ ์์์ (i, j) ์ฐพ๊ธฐ
for(int i=0; i<=N-n; i++) {
for(int j=0; j<=N-n; j++) {
isPeople = false;
isExit = false;
// ์ ์ฌ๊ฐํ ์์์ ์ผ๋ก๋ถํฐ ํ ๋ณ์ ๊ธธ์ด๊น์ง ๋ฒ์ ํ์
for(int ni=i; ni<i+n; ni++) {
for(int nj = j; nj<j+n; nj++) {
if(ni==exitX && nj==exitY) isExit=true;
if(peopleLoc[ni][nj].size()>0) isPeople=true;
}
}
// ํ ๋ช
์ด์์ ์ฐธ๊ฐ์์ ์ถ๊ตฌ๋ฅผ ํฌํจํ๋ ์ ์ฌ๊ฐํ์ ์ฐพ์๋ค๋ฉด break loop
if(isExit && isPeople) {
sx = i;
sy = j;
sn = n;
break loop;
}
}
}
}
}
๐น rotate() : ์ ํ๋ ์ ์ฌ๊ฐํ์ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ์ํค๊ธฐ
// ๋ฏธ๋ก ํ์ --> ์ ํ๋ ์ ์ฌ๊ฐํ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ & ํ์ ๋ ๋ฒฝ์ ๋ด๊ตฌ๋ -1
static void rotate() {
int[][] sub = new int[sn][sn];
int[][] sub2 = new int[sn][sn];
// ์ ํ๋ ์ ์ฌ๊ฐํ ๋ฒ์์ ํด๋นํ๋ ์ ๋ณด๋ฅผ sub ๋ฐฐ์ด์ ๋ฐ์
for(int i=0; i<sn; i++) {
for(int j=0; j<sn; j++) {
sub[i][j] = maze[sx+i][sy+j];
}
}
// sub ๋ฐฐ์ด์ ํ์ ์ํค๊ณ ํ์ ๊ฒฐ๊ณผ๋ฅผ sub2 ๋ฐฐ์ด์ ๋ฐ์
for(int i=0; i<sn; i++) {
for(int j=0; j<sn; j++) {
sub2[i][j] = sub[sn-j-1][i];
// ์ ์ฌ๊ฐํ์ ํฌํจ๋๋ ๋ด๊ตฌ์ฑ-1 & ์ถ๊ตฌ ์ ๋ณด ์
๋ฐ์ดํธ
if(sub2[i][j]>0) sub2[i][j]--;
if(sub2[i][j]<0) {
exitX=i+sx;
exitY=j+sy;
}
}
}
// ๋ฏธ๋ก์ ๋ฐ์
for(int i=0; i<sn; i++) {
for(int j=0; j<sn; j++) {
maze[i+sx][j+sy] = sub2[i][j];
}
}
// ์ฐธ๊ฐ์ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์
for(int i=0; i<sn; i++) {
for(int j=0; j<sn; j++) {
if(peopleLoc[i+sx][j+sy].size()>0) {
for(int n=0; n<peopleLoc[i+sx][j+sy].size(); n++) {
int pIdx = peopleLoc[i+sx][j+sy].get(n);
Info now = people[pIdx];
now.x = j+sx;
now.y = (sn-i-1)+sy;
}
}
}
}
}
๐ฉ๐ป ์ ์ฒด ์ฝ๋
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class final_2023_1_๋ฉ์ด์ฆ๋ฌ๋ {
static int N, M, K;
static int[][] maze;
static Info[] people;
static int exitX, exitY;
static int moveDist;
static int sx, sy, sn; // ํ ๋ช
์ด์์ ์ฐธ๊ฐ์์ ์ถ๊ตฌ๋ฅผ ํฌํจํ ๊ฐ์ฅ ์์ ์ ์ฌ๊ฐํ ์์ ์ขํ์ ํ๋ณ์ ๊ธธ์ด
static List<Integer>[][] peopleLoc;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static class Info{
int x, y;
boolean escaped;
public Info(int x, int y, boolean escaped) {
this.x=x;
this.y=y;
this.escaped=escaped;
}
}
static void simulate() {
while(K-->0) {
move();
if(checkEscape()) break;
putPeople();
findSquare();
rotate();
putPeople();
}
}
// ์ฐธ๊ฐ์ ํ ์นธ์ฉ ์ด๋ --> ์ถ๊ตฌ๊น์ง ๊ฐ๊น์์ ธ์ผ ํจ --> ์์ง์ผ ์ ์๋ ์นธ์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์ํ ์ฐ์ ์
static void move() {
for(int i=1; i<=M; i++) {
Info p = people[i];
int npx=0, npy=0;
// ํ์ฌ ์์น์์ ์ถ๊ตฌ๊น์ง์ ๊ฑฐ๋ฆฌ
int minDist = Math.abs(p.x-exitX)+ Math.abs(p.y-exitY);
if(!p.escaped) {
for(int d=0; d<4; d++) {
int nx = p.x+dx[d];
int ny = p.y+dy[d];
// ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ๋ฒฝ์ด ์์ผ๋ฉด ์ด๋ ๋ถ๊ฐ
if(inRange(nx, ny) && (maze[nx][ny]==0||maze[nx][ny]==-1)) {
// ํ์ฌ ์์น๋ณด๋ค ์ด๋ํ ์์น๊ฐ ์ถ๊ตฌ์ ๋ ๊ฐ๊น์ด์ง ํ์ธ
int nDist = Math.abs(nx-exitX)+ Math.abs(ny-exitY);
if(nDist<minDist) {
minDist = nDist;
npx = nx;
npy = ny;
}
}
}
}
// ํ์ฌ ์์น๋ณด๋ค ๋ ๊ฐ๊น๊ฒ ์ด๋ํ ์ ์๋ค๋ฉด ์ด๋ X
if(minDist == Math.abs(p.x-exitX)+ Math.abs(p.y-exitY))continue;
moveDist++;
p.x = npx;
p.y = npy;
// ์ถ๊ตฌ์ ๋์ฐฉํ๋ค๋ฉด ํ์ถ
if(p.x==exitX && p.y==exitY) p.escaped=true;
}
}
// ํ ๋ช
์ด์์ ์ฐธ๊ฐ์์ ์ถ๊ตฌ๋ฅผ ํฌํจํ ๊ฐ์ฅ ์์ ์ ์ฌ๊ฐํ ์ฐพ๊ธฐ
// ๊ฐ์ฅ ์์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ์ ์ฌ๊ฐํ์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์ข์๋จ x ์ขํ๊ฐ ์์ ๊ฒ์ด ์ฐ์ , ๊ทธ๋๋ ๊ฐ์ผ๋ฉด y ์ขํ๊ฐ ์์ ๊ฒ์ด ์ฐ์
static void findSquare() {
boolean isPeople = false; // ์ฐธ๊ฐ์ ํฌํจ ์ฌ๋ถ
boolean isExit = false; // ์ถ๊ตฌ ํฌํจ์ฌ๋ถ
loop:
// ํ ๋ณ์ ๊ธธ์ด (์ต์ ๊ธธ์ด=2)
for(int n=2; n<=N; n++) {
for(int i=0; i<=N-n; i++) {
for(int j=0; j<=N-n; j++) {
isPeople = false;
isExit = false;
for(int ni=i; ni<i+n; ni++) {
for(int nj = j; nj<j+n; nj++) {
if(ni==exitX && nj==exitY) isExit=true;
if(peopleLoc[ni][nj].size()>0) isPeople=true;
}
}
if(isExit && isPeople) {
sx = i;
sy = j;
sn = n;
break loop;
}
}
}
}
}
// ๋ฏธ๋ก ํ์ --> ์ ํ๋ ์ ์ฌ๊ฐํ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ & ํ์ ๋ ๋ฒฝ์ ๋ด๊ตฌ๋ -1
static void rotate() {
int[][] sub = new int[sn][sn];
int[][] sub2 = new int[sn][sn];
for(int i=0; i<sn; i++) {
for(int j=0; j<sn; j++) {
sub[i][j] = maze[sx+i][sy+j];
}
}
for(int i=0; i<sn; i++) {
for(int j=0; j<sn; j++) {
sub2[i][j] = sub[sn-j-1][i];
if(sub2[i][j]>0) sub2[i][j]--;
if(sub2[i][j]<0) {
exitX=i+sx;
exitY=j+sy;
}
}
}
// ๋ฏธ๋ก์ ๋ฐ์
for(int i=0; i<sn; i++) {
for(int j=0; j<sn; j++) {
maze[i+sx][j+sy] = sub2[i][j];
}
}
// ์ฐธ๊ฐ์ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์
for(int i=0; i<sn; i++) {
for(int j=0; j<sn; j++) {
if(peopleLoc[i+sx][j+sy].size()>0) {
for(int n=0; n<peopleLoc[i+sx][j+sy].size(); n++) {
int pIdx = peopleLoc[i+sx][j+sy].get(n);
Info now = people[pIdx];
now.x = j+sx;
now.y = (sn-i-1)+sy;
}
}
}
}
}
// ๋ชจ๋ ๋ค ํ์ถํ๋์ง ํ์ธ
static boolean checkEscape() {
boolean flag = true;
for(int i=1; i<=M; i++) {
Info p = people[i];
if(!p.escaped) {
flag=false;
break;
}
}
return flag;
}
// ์ฌ๋๋ค์ ์์น๋ฅผ ๋ฏธ๋ก์ ๋ฐ์์ํค๊ธฐ
static void putPeople() {
peopleLoc = new ArrayList[N][N];
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
peopleLoc[i][j] = new ArrayList<>();
}
}
for(int i=1; i<=M; i++) {
Info p = people[i];
if(!p.escaped) {
peopleLoc[p.x][p.y].add(i);
}
}
}
static boolean inRange(int x, int y) {
if(x>=0 && x<N && y>=0 && y<N) return true;
else return false;
}
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());
K = Integer.parseInt(st.nextToken());
maze = new int[N][N];
people = new Info[M+1];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++) {
maze[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i=1; i<=M; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken())-1;
int y = Integer.parseInt(st.nextToken())-1;
people[i] = new Info(x, y, false);
}
st = new StringTokenizer(br.readLine());
exitX = Integer.parseInt(st.nextToken())-1;
exitY = Integer.parseInt(st.nextToken())-1;
maze[exitX][exitY] = -1;
simulate();
bw.write(moveDist + "\n");
bw.write((exitX+1) + " " + (exitY+1));
bw.flush();
bw.close();
}
}
โ๏ธ ํจ์จ์ ์ผ๋ก 90๋ ํ์ ์ํค๋ ์ฝ๋
๋ค๋ฅธ ํ์ด๋ฒ ์ค ๋ด๊ฐ ๊ตฌํํ ๊ฒ๋ณด๋ค ์ฌ์ด ์ฝ๋๊ฐ ์์ด์ ๊ธฐ๋กํ๋ค.
sub๋ฐฐ์ด์ ์ฌ์ฉํ์ง ์๊ณ (sx, sy)์ (0, 0)์ผ๋ก ์ฎ๊ฒจ์ ๊ตฌํํ ์ฝ๋์ด๋ค.
List<Integer>[][] peopleLoc์ ๊ตณ์ด ๋ง๋ค์ง ๋ง๊ณ Info[] people๋ง ์ด์ฉํด์ ๊ตฌํํด๋ ์ถฉ๋ถํ๋ค.
// ์ ์ฌ๊ฐํ ๋ด๋ถ์ ๋ฒฝ์ ํ์ ์ํต๋๋ค.
public static void rotateSquare() {
// ์ฐ์ ์ ์ฌ๊ฐํ ์์ ์๋ ๋ฒฝ๋ค์ 1 ๊ฐ์์ํต๋๋ค.
for(int x = sx; x < sx + squareSize; x++)
for(int y = sy; y < sy + squareSize; y++) {
if(board[x][y] > 0) board[x][y]--;
}
// ์ ์ฌ๊ฐํ์ ์๊ณ๋ฐฉํฅ์ผ๋ก 90' ํ์ ํฉ๋๋ค.
for(int x = sx; x < sx + squareSize; x++)
for(int y = sy; y < sy + squareSize; y++) {
// Step 1. (sx, sy)๋ฅผ (0, 0)์ผ๋ก ์ฎ๊ฒจ์ฃผ๋ ๋ณํ์ ์งํํฉ๋๋ค.
int ox = x - sx, oy = y - sy;
// Step 2. ๋ณํ๋ ์ํ์์๋ ํ์ ์ดํ์ ์ขํ๊ฐ (x, y) -> (y, squareN - x - 1)๊ฐ ๋ฉ๋๋ค.
int rx = oy, ry = squareSize - ox - 1;
// Step 3. ๋ค์ (sx, sy)๋ฅผ ๋ํด์ค๋๋ค.
nextBoard[rx + sx][ry + sy] = board[x][y];
}
// nextBoard ๊ฐ์ ํ์ฌ board์ ์ฎ๊ฒจ์ค๋๋ค.
for(int x = sx; x < sx + squareSize; x++)
for(int y = sy; y < sy + squareSize; y++) {
board[x][y] = nextBoard[x][y];
}
}
// ๋ชจ๋ ์ฐธ๊ฐ์๋ค ๋ฐ ์ถ๊ตฌ๋ฅผ ํ์ ์ํต๋๋ค.
public static void rotateTravelerAndExit() {
// m๋ช
์ ์ฐธ๊ฐ์๋ค์ ๋ชจ๋ ํ์ธํฉ๋๋ค.
for(int i = 1; i <= m; i++) {
int x = traveler[i].x;
int y = traveler[i].y;
// ํด๋น ์ฐธ๊ฐ์๊ฐ ์ ์ฌ๊ฐํ ์์ ํฌํจ๋์ด ์์ ๋์๋ง ํ์ ์ํต๋๋ค.
if(sx <= x && x < sx + squareSize && sy <= y && y < sy + squareSize) {
// Step 1. (sx, sy)๋ฅผ (0, 0)์ผ๋ก ์ฎ๊ฒจ์ฃผ๋ ๋ณํ์ ์งํํฉ๋๋ค.
int ox = x - sx, oy = y - sy;
// Step 2. ๋ณํ๋ ์ํ์์๋ ํ์ ์ดํ์ ์ขํ๊ฐ (x, y) -> (y, squareN - x - 1)๊ฐ ๋ฉ๋๋ค.
int rx = oy, ry = squareSize - ox - 1;
// Step 3. ๋ค์ (sx, sy)๋ฅผ ๋ํด์ค๋๋ค.
traveler[i].x = rx + sx;
traveler[i].y = ry + sy;
}
}
// ์ถ๊ตฌ์๋ ํ์ ์ ์งํํฉ๋๋ค.
int x = exits.x;
int y = exits.y;
if(sx <= x && x < sx + squareSize && sy <= y && y < sy + squareSize) {
// Step 1. (sx, sy)๋ฅผ (0, 0)์ผ๋ก ์ฎ๊ฒจ์ฃผ๋ ๋ณํ์ ์งํํฉ๋๋ค.
int ox = x - sx, oy = y - sy;
// Step 2. ๋ณํ๋ ์ํ์์๋ ํ์ ์ดํ์ ์ขํ๊ฐ (x, y) -> (y, squareN - x - 1)๊ฐ ๋ฉ๋๋ค.
int rx = oy, ry = squareSize - ox - 1;
// Step 3. ๋ค์ (sx, sy)๋ฅผ ๋ํด์ค๋๋ค.
exits.x = rx + sx;
exits.y = ry + sy;
}
}
'์๊ณ ๋ฆฌ์ฆ > CodeTree' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CodeTree] ๋ฃจ๋ํ์ ๋ฐ๋ - Java (2) | 2024.04.06 |
---|---|
[CodeTree] ์ธ์๋ - Java (0) | 2024.03.24 |