๋ฌธ์
ํ์ด
- ํด๋น ํ์ด์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ ์ ๋์ ์ด๋์ ์ ์ดํ๋ ๊ฒ (์๋ฐฉํฅ, ์ญ๋ฐฉํฅ)
- ๋ํ ๋ฐฉํฅ์ ๋ํด ์ ๋ฆฌ๋ฅผ ํด๋๋ ๊ฒ์ ์ค์ ์ผ๋ก ๊ตฌํํ๋ค.
- ์๋ฐฉํฅ : dxy -> ์ ์ฐ ํ ์ข (์์ฉ๋์ด ์๋ฐฉํฅ)
- ์ญ๋ฐฉํฅ : rdxy -> ํ ์ฐ ์ ์ข (์์ฉ๋์ด ์ญ๋ฐฉํฅ)
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Pair {
int x;
int y;
int d; // ๋ฐฉํฅ ์์ขํ์ฐ -> 0,1,2,3
public Pair(int x, int y) {
this.x = x;
this.y = y;
this.d = -1;
}
public Pair(int x, int y, int d) {
this.x = x;
this.y = y;
this.d = d;
}
int getDistance(int x, int y){
return Math.abs(x - this.x) + Math.abs(y - this.y);
}
}
public class Main {
static int N, M, H, K;
static int answer;
static Pair[] thieves;
static Pair[] trees;
static Pair tagger;
static int[][] dir;
static int[][] dxy = {{-1,0},{0,1},{1,0},{0,-1}};
static int[][] rdxy = {{1,0},{0,1},{-1,0},{0,-1}};
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()); // ๋๋ง์ ์
H = Integer.parseInt(st.nextToken()); // ๋๋ฌด ์
K = Integer.parseInt(st.nextToken()); // ์ด ํด ํ์
thieves = new Pair[M];
trees = new Pair[H];
answer = 0;
// ์ ๋๋ ๊ฐ์ด๋ฐ์ ์์ํ๊ณ
// ๋๋ง์๋ ์ข์ฐ๋ก ์ด๋ํ๋ฉด ์ฐ, ์ํ๋ก ์ด๋ํ๋ฉด ํ ์์
// ๋๋ฌด์ ๋๋ง์๋ ์ด๊ธฐ์ ๊ฒน์ณ์์ ์ ์๋ค.
// ๋๋ง์ ์ ๋ณด
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int tempX = Integer.parseInt(st.nextToken())-1;
int tempY = Integer.parseInt(st.nextToken())-1;
int tempD = Integer.parseInt(st.nextToken());
if(tempD == 1) {
tempD = 1; // ์ฐ
}else if(tempD == 2) {
tempD = 2; // ํ
}
thieves[i] = new Pair(tempX, tempY, tempD);
}
// ๋๋ฌด ์ ๋ณด
for(int i = 0; i < H; i++) {
st = new StringTokenizer(br.readLine());
trees[i] = new Pair(Integer.parseInt(st.nextToken())-1, Integer.parseInt(st.nextToken())-1);
}
// ์ด์ ์ ๋ ์ด๊ธฐ๊ฐ ์ ํด์ฃผ๊ณ ๋ฐ๋ก ๋ฐฉํฅ์ ํด์ ์๋ฎฌ ๋๋ฆฌ๋ฉด ๋จ.
tagger = new Pair(N/2, N/2, 0);
simulation();
System.out.println(answer);
}
static void simulation() {
//์ ๋๋ ์์ฉ๋์ด ๋ฐฉํฅ์ผ๋ก ๋๊ฐ์ผํจ.
// K๋ฒ ๋งํผ ์งํ
int move = 1;
int moveCnt = 0; // 2 ๊ฐ ๋ ๋๋ง๋ค move๋ฅผ 1์ฉ ์ฌ๋ ค์ค
int cnt = 0;
dir = dxy;
boolean rFlag = false;
for(int t = 1; t <= K; t++) {
moveThieves();
int nx = tagger.x + dir[tagger.d][0];
int ny = tagger.y + dir[tagger.d][1];
tagger.x = nx;
tagger.y = ny;
cnt++;
if(!rFlag && nx == 0 && ny == 0) {
rFlag = true;
dir = rdxy;
tagger.d = 0;
moveCnt = -1;
cnt = 0;
move = N-1;
}
else if(rFlag && nx == N/2 && ny == N/2) {
rFlag = false;
dir = dxy;
tagger.d = 0;
cnt = 0;
moveCnt = 0;
move = 1;
}
else {
if(cnt == move) {
cnt = 0;
moveCnt++;
tagger.d = (tagger.d+1) % 4;
if(moveCnt == 2) {
moveCnt = 0;
if(rFlag) move -= 1;
else move += 1;
}
}
}
countScore(t);
}
}
static void moveThieves() {
for(int i = 0; i < M; i++) {
if(thieves[i].d == -1) continue; // ์กํ ๊ฒฝ์ฐ
if(thieves[i].getDistance(tagger.x, tagger.y) > 3) continue;
int curX = thieves[i].x;
int curY = thieves[i].y;
int curD = thieves[i].d;
int nx = curX + dxy[curD][0];
int ny = curY + dxy[curD][1];
// ์ด์จ๋ ๋ค์์์น์ ์ ๋๊ฐ ์์ด๋ ๋ฒ์ด๋๋ฉด ๋ฐฉํฅ์ ํ์ ํด์ค์ผํจ.
if(nx < 0 || ny < 0 || nx >= N || ny >= N) {
thieves[i].d = (curD + 2) % 4;
curD = thieves[i].d;
nx = curX + dxy[curD][0];
ny = curY + dxy[curD][1];
}
// ๋ค์์์น์ ์ ๋๊ฐ ์๋ค๋ฉด
if(tagger.getDistance(nx, ny) == 0) continue;
// ์ ๋๊ฐ ์๋ค๋ฉด
thieves[i].x = nx;
thieves[i].y = ny;
}
}
static void countScore(int turn) {
int curD = tagger.d;
for(int i = 0; i < 3; i++) { // ์ ๋์ ์์ผ๋ ์ธ์ ๋ 3
int nx = tagger.x + dir[curD][0] * i;
int ny = tagger.y + dir[curD][1] * i;
if(nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
for(int j = 0; j < M; j++) { // ๋๋ง์ ์์น ์ฒดํฌ
if(thieves[j].d == -1) continue;
if(thieves[j].getDistance(nx, ny) == 0 && !checkTreeHide(nx, ny)) {
thieves[j].d = -1;
answer += turn;
}
}
}
}
static boolean checkTreeHide(int x, int y) {
for(int i = 0; i < H; i++) {
if(trees[i].x == x && trees[i].y == y) return true;
}
return false;
}
}
- ๊ตฌํ์ ์ค์(?) ๋๋ฌธ์ ์กฐ๊ธ ์ ๋ฅผ ๋จน์๋ค. -> ์ ๋์ ๋ฐฉํฅ์ dxy ์ rdxy ๋ก ์๋ฐฉํฅ๊ณผ ์ญ๋ฐฉํฅ์ ๊ตฌ๋ณํด๋๊ณ ์ ์ countScore ๋ฉ์๋์์ ์ ๋๊ฐ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์์๋ dxy๋ง ์ฌ์ฉํด์ rdxy ๋ฐฉํฅ์ผ๋ก ์ ๋๊ฐ ์ด๋ํ ๋ ์ ํํ ๋ฐฉํฅ์ ๋ํ ์ ์๋ฅผ ๊ณ์ฐํ์ง ๋ชปํ๊ฒ ๊ตฌํ์ด ๋์์๋ค. -> ์ฐพ๋๋ฐ ๊ฑฐ์ 2์๊ฐ์ด๋ฏ...
ํด๋น ๋ฉ์๋๋ค์ ๊ตฌ๋ถ์ ์๋์ ๊ฐ๋ค.
๋ฉ์๋๋ช | ๊ธฐ๋ฅ | ๋น๊ณ |
main | - ๊ฐ์ข
static ๋ณ์๋ค๊ณผ ์
๋ ฅ๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌํ๋ค. - ๋ํ Pair ํด๋์ค ์ ์ธ์ ๋ฐ๋ฅธ ๊ฐ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํํ์ฌ ๋ฐฐ์ด์ ๋ด๋๋ค. - ์ดํ simulation ๋ฉ์๋๋ฅผ ์คํํ๊ณ ์ต์ข ์ ์ผ๋ก answer๋ฅผ ์ถ๋ ฅํ๋ค. |
|
simulation | - ์ ์ฒด simulation์ ์งํํ๋ค. - board ๋ฅผ ์ง์ ๊ทธ๋ฆฌ๋๊ฒ ์๋ ์ ๋, ๋๋ฌด, ๋๋ง์ ๊ฐ์ฒด์ ๋ํ ์ขํ ๊ณ์ฐ ๋ฐ ๋น๊ต๋ฅผ ํตํด ํ์ด๋ฅผ ์งํํ๊ฒ๋๋ค. - ์ค์ ์ ๋์ ์ด๋์ ํด๋น ๋ฉ์๋์์ ๊ฐ turn์ ๋ฐ๋ผ ์ด๋์ํจ๋ค. |
|
moveThieves | - ๋๋ง์ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด์ ๋ด์ thieves ๋ฐฐ์ด์ ์ ์ธํ๋ค. - ํด๋น ๋ฐฐ์ด ๋ด ์ ์ฅ๋ Pair ๊ฐ์ฒด๋ค์ ๋ํ ์ด๋์ ์ํํ๋ค. - ๋ฌธ์ ์์ ์ ์๋ ์กฐ๊ฑด์ ๋ฐํ์ผ๋ก ์ ๋, ๋ฒ์ ๋ฑ์ ๋ฐ๋ผ ์ด๋ํ๊ฑฐ๋ ๋ฐฉํฅ์ ๋ฐ๊พธ๋ ๊ณผ์ ์ ํฌํจํ๋ค. |
|
countScore | - ์ ๋์ ์ด๋์ด ๋๋๋ฉด ํด๋น ์ ๋๊ฐ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ํตํด ์ ์๋ฅผ ๊ตฌํด์ผํ๋ค. - ํด๋น ์์ ๊น์ง ์ด๋ํ ์ ๋, ๋๋ง์์ ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋๋ฌด์ ์์น๋ฅผ ๋ฐ์ ธ ์ ๋๊ฐ ๋ช์ ์ ๊ฐ์ ธ๊ฐ ์ ์๋์ง ๊ณ์ฐํ๊ณ ์ ๋๊ฐ ๋๋ง์๋ฅผ ์ก์ผ๋ฉด ๋๋ง์์ ๋ฐฉํฅ์ -1 ๋ก ์ฒ๋ฆฌํ์ฌ "์กํ" ์ฒ๋ฆฌํ๋ค. |
|
checkTreeHide | - ๋๋ฌด์ ์์น๋ ๊ณ ์ ๋์ด ์๋ค. - ๋ฐ๋ผ์ ํด๋น ๋๋ฌด๋ค์ ์์น๋ฅผ ์ธ์๋ก ๋ค์ด์จ x, y ์ขํ์ ๋น๊ตํ์ฌ ๋๋ฌด์ ์์น๊ฐ ๊ฐ์์ง ์๋์ง๋ฅผ boolean ๊ฐ์ผ๋ก ๋ฐํํ๋ค. |
- ์ฌ์ค ๋๋ฌด์ ์์น๋ ๊ณ ์ ๋์ด์๊ธฐ ๋๋ฌธ์ board์์ ๊ทธ๋ฅ ์์น๋ฅผ ๋ฐ์๋๋ ๋์์ ๋ฒํ๋ค. - board์ ํ์ ์ boolean์ผ๋ก ํ๋ฉด H ์ต๋ 10000๊ฐ์ ๋ํ ๋ฐ๋ณต๋ฌธ์ ๋ฐฐ์ด ๊ฐ ์ฐธ์กฐ๋ก ์ค์ผ ์ ์์ ๊ฒ. |
๊ฐ์ฅ ์ค์ํ๋ค๊ณ ์๊ฐ๋๋ ๋ก์ง์ ์๋ ์ฝ๋์ ์๋ ์ ๋์ ์ด๋์ด๋ค.
//์ ๋๋ ์์ฉ๋์ด ๋ฐฉํฅ์ผ๋ก ๋๊ฐ์ผํจ.
// K๋ฒ ๋งํผ ์งํ
int move = 1;
int moveCnt = 0; // 2 ๊ฐ ๋ ๋๋ง๋ค move๋ฅผ 1์ฉ ์ฌ๋ ค์ค
int cnt = 0;
dir = dxy;
boolean rFlag = false;
for(int t = 1; t <= K; t++) {
moveThieves();
int nx = tagger.x + dir[tagger.d][0];
int ny = tagger.y + dir[tagger.d][1];
tagger.x = nx;
tagger.y = ny;
cnt++;
if(!rFlag && nx == 0 && ny == 0) {
rFlag = true;
dir = rdxy;
tagger.d = 0;
moveCnt = -1;
cnt = 0;
move = N-1;
}
else if(rFlag && nx == N/2 && ny == N/2) {
rFlag = false;
dir = dxy;
tagger.d = 0;
cnt = 0;
moveCnt = 0;
move = 1;
}
else {
if(cnt == move) {
cnt = 0;
moveCnt++;
tagger.d = (tagger.d+1) % 4;
if(moveCnt == 2) {
moveCnt = 0;
if(rFlag) move -= 1;
else move += 1;
}
}
}
countScore(t);
}
- ์ด๊ธฐ move, moveCnt, cnt ๋ฅผ ์ ์ธํ๋ค. ๊ฐ๊ฐ์ ์ญํ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- move : ํ์ฌ ์ ๋๊ฐ ์ด๋ํ ์ ์๋ ์ต๋๊ฐ (ํ์ฌ ๋ฐฉํฅ์ผ๋ก)
- moveCnt : ์์ฉ๋์ด์ ํน์ฑ์ (์๋ฐฉํฅ๊ธฐ์ค) ์, ์ฐ, ํ, ์ข ์ด๋์ด 1, 1, 2,2, 3,3,4,4 ... ์์ผ๋ก ๋๋ฒ์ฉ ๋ฐ๋ณต๋๋ค. ์ด๋, 2๋ฒ ์ด๋ํ๋์ง ์ ์ด๋ฅผ ์ํด ์ฌ์ฉ๋๋ ๋ณ์์ด๋ค.
- cnt : move์ ๊ฐ์ ํ์ฌ ์ ๋๊ฐ ์ด๋ํ ์ ์๋ ์ต๋๊ฐ์ด๋ผ๋ฉด ํ์ฌ ์ ๋๊ฐ ๋ช ์นธ ์ด๋ํ๋์ง์ ๋ํ ๊ฐ์ด ํ์ํ๋ค. ๊ทธ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ๋ณ์์ด๋ค.
- ์์ฉ๋์ด ์์ง์(์๋ฐฉํฅ) ์ ์๋๋ฅผ ํ์ธํด๋ณด์
- ์๋ฐฉํฅ์ผ๋ก ์์ง์ผ ๋ ์ ๋๋ ์๋ถํฐ ์์ํ๊ณ ์ -> ์ฐ -> ํ -> ์ข ๋ฐฉํฅ์ ํ์ ๋ฐ๋ณตํ๋ค.
- ์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ๋ถ๋ถ์ ๋ง์ง๋ง ์ฆ N๊ณผ ๊ฐ์ ๊ฐ์ด ๋๋ ๋ง์ง๋ง ์ด๋์ ๊ฒฝ์ฐ์๋ 5๋งํผ ์ด๋ํ๋ฉด ์ ํด์ง ๊ตฌ์ญ์ ๋ฒ์ด๋๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ํด๋น ๋ถ๋ถ์ ์ ์ดํด์ค์ผํ๊ณ ์ ์ฝ๋์ ์๋์ ๊ฐ์ ์ ์ด๋ฌธ์ด ์ถ๊ฐ๋๋ค.
if(!rFlag && nx == 0 && ny == 0) {
rFlag = true;
dir = rdxy;
tagger.d = 0;
moveCnt = -1;
cnt = 0;
move = N-1;
}
- rFlag๋ (reverseFlag) false์ผ ๋ ์๋ฐฉํฅ์ผ๋ก ์ด๋ํ๊ณ ์์์ ๋ปํ๋ค.
- ํด๋น ๋ถ๋ถ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ธฐ์ ์ ๋ง์ง๋ง์ผ๋ก ์ ๋๊ฐ ์ด๋ํ๋ ์ขํ๊ฐ 0,0 ์ด๋ผ๋ฉด rFlag๋ฅผ true๋ก ๋ฐ๊ฟ์ฃผ๊ณ ์ดํ dir ์ฌ์ค์ ํด์ค๋ค.
- cnt๋ ์ญ๋ฐฉํฅ์ผ๋ก ๋ค์ ์ธ์ค์ผํด์ 0์ผ๋ก ์ค์ ํ๊ณ , move ๊ฐ์ ๊ฒฝ์ฐ์๋ N-1 ๋ก ์ค์ ํด์ค๋ค.(moveCnt์์ ์ค๋ช ์ถ๊ฐ)
- ํด๋น ์ฝ๋์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ moveCnt ๋ฅผ -1๋ก ์ค์ ํ๋ ๋ถ๋ถ์ด๋ค.
- moveCnt๋ฅผ -1๋ก ์ค์ ํ๋ ์ด์ ๋ 0,0 ์ขํ์์น์์ ์ ๋์ ์์ง์์ด ๋๋๋ฉด ๋๋์๊ฐ๋ ๊ธฐ์กด 1,1,2,2,3,3,4,4,... ๋ก ์๋ฐฉํฅ์ด๋์ ํ๋ค๊ณ ๋์๊ฐ๋์๋ ๋ง์ฐฌ๊ฐ์ง๋ก 4,4,3,3,2,2,1,1 ์ ํด์ผํ ์ ์๋ค. ์๋ ๊ทธ๋ฆผ์ ๋ณด์
- ์ญ๋ฐฉํฅ์ ๊ฒฝ์ฐ์๋ 0,0 ๋ถํฐ ์์ํด N-1 ๋งํผ 3๋ฒ ์์ง์ด๊ณ ๊ทธ ๋ค์ 2ํ์ฉ ๋ฐ๋ณต๋๋ค.
- ๋ฐ๋ผ์ ์ญ๋ฐฉํฅ์ผ๋ก ๋ฐฉํฅ์ ํ์ ํ ๋ ์ด๊ธฐ์๋ moveCnt = -1๋ก ๊ฐ์ ์ค์ ํ๊ณ ์ดํ else ๋ฌธ์์ ๋ฐฉํฅ์ ํ์ ํ ๋์๋ ๋ค์ moveCnt = 0์ผ๋ก ํด์ฃผ๋ ๊ฒ์ ํตํด ์ญ๋ฐฉํฅ ์ถ๋ฐํ N-1 ๋งํผ ์ด 3๋ฒ ์์ง์ด๊ณ move ๊ฐ์ ์ค์ด๋๋ก ๊ตฌํํ๋ค.
if(!rFlag && nx == 0 && ny == 0) {
rFlag = true;
dir = rdxy;
tagger.d = 0;
moveCnt = -1;
cnt = 0;
move = N-1;
}
else if(rFlag && nx == N/2 && ny == N/2) {
rFlag = false;
dir = dxy;
tagger.d = 0;
cnt = 0;
moveCnt = 0;
move = 1;
}
else {
if(cnt == move) {
cnt = 0;
moveCnt++;
tagger.d = (tagger.d+1) % 4;
if(moveCnt == 2) {
moveCnt = 0;
if(rFlag) move -= 1;
else move += 1;
}
}
}
- ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ค์ฌ์ ์ผ๋ก ๋์๊ฐ๋ฉด ์ด๊ธฐ ์ค์ ํ๋ ๋๋ก rFlag๋ false, dir ๋ฐฉํฅ์ ์๋ฐฉํฅ์ผ๋ก ์ค์ ํ๊ณ cnt, moveCnt, move ๊ฐ์ ์ด๊ธฐ ์ค์ ํ๋ ๊ฐ๋ค๋ก ์ค์ ํด์ฃผ๋ฉด ๋ง์ ํ์์ผ์ง๋ผ๋ ์ ๋๋ ์๋ฐฉํฅ, ์ญ๋ฐฉํฅ ์์ง์์ ๋ฐ๋ณตํ ์ ์๋ค.
+) ์ค๋ช ์ด ์ถฉ๋ถํ์ง ๋ชจ๋ฅด๊ฒ ๋ค์... ใ