๐ ๋ฌธ์
๐ ์์ด๋์ด
์๋ฎฌ๋ ์ด์ ๋ฌธ์ ์ ๋๋ค. ์ผ์ฑ์ ์๋ฎฌ๋ ์ด์ ๋ฌธ์ ๋ ๋ฌธ์ ๋ฅผ ์ ์ฝ๊ณ ๋ฌธ์ ์ ์ ํ ์์ ๊ทธ๋๋ก ์ฝ๋๋ฅผ ์ง๋ ๊ฒ์ด ์ค์ํ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ฅผ ์ํด์ ๋จผ์ ์ด๋ํด์ผํ ๋ฌผ๊ณ ๋ฆฌ๋ฅผ ๋ชจ๋ ์๋ณํ๊ณ , ํด๋น ๋ฌผ๊ณ ๋ฆฌ๋ฅผ index์์ผ๋ก ์ ๋ ฌ ํ์ ์ด๋์ํต๋๋ค.
์ด๋ ํ์๋ ์์ด๊ฐ ์์ง์ ๋๋ค. ์ฌ๊ธฐ์ ์์ด๊ฐ ๋จน์ ์ ์๋ ๋ชจ๋ ๋ฌผ๊ณ ๋ฆฌ์ ๋ํด์ DFS๋ฅผ ์งํํฉ๋๋ค.
(๋ฌผ๊ณ ๊ธฐ๊ฐ ํ์ฌ ์ด๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์๋ค๋ฉด ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 45๋ ํ์ ํ๋ค.) -> ์ ๋ ์ด ๋ถ๋ถ์ ๋๋ฆฌ๊ธฐ๋ง ํ๊ณ ๋ฌผ๊ณ ๊ธฐ์ ๋ฐฉํฅ์ ๋ฐ๊พธ์ง ์์์ ์๋ฌ๋ฅผ ์ก๋๋ผ ์๊ฐ์ด ์ข ๊ฑธ๋ ธ์ต๋๋.. ใ ใ ใ
๐ ํ์ด
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;
public class boj_19236_์ฒญ์๋
์์ด {
private static final int[][] dirs = {{-1, 0}, {-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}};
private static int maxScore = 0;
private static class Fish {
int index;
int dirIndex;
int x, y;
public Fish(Fish fish) {
this.index = fish.index;
this.dirIndex = fish.dirIndex;
this.x = fish.x;
this.y = fish.y;
}
public Fish(int index, int dirIndex, int x, int y) {
this.index = index;
this.dirIndex = dirIndex;
this.x = x;
this.y = y;
}
public void set(int x, int y) { //๊น์ ๋ณต์ฌ๋ฅผ ์ํ ํฉํ ๋ฆฌ ๋ฉ์๋
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
Fish[][] fishArr = new Fish[4][4];
for (int i = 0; i < 4; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 4; j++) {
int index = Integer.parseInt(st.nextToken());
int dir = Integer.parseInt(st.nextToken()) - 1;
fishArr[i][j] = new Fish(index, dir, i, j);
}
}
Fish fish = fishArr[0][0];
fishArr[0][0] = null; //0,0๋ฌผ๊ณ ๊ธฐ๋ ์ด๋ฏธ ๋จนํ๊ธฐ๋๋ฌธ์
dfs(fishArr, 0, 0, fish.index, fish.dirIndex);
System.out.println(maxScore);
}
public static void dfs(Fish[][] fishArr, int sX, int sY, int score, int dir) { //๋ฌผ๊ณ ๊ธฐ ์์น, ์์ดx, ์์ด y, ํ์ฌ ์ ์, ํ์ฌ ์์ด์ ๋ฐฉํฅ
maxScore = Math.max(maxScore, score);
//์ด๋ํ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋ชจ๋ ์ฒดํฌํ๋ค.
List<Fish> fishPoll = new ArrayList<>();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (fishArr[i][j] != null) {
fishPoll.add(fishArr[i][j]);
}
}
}
// ๋ฌผ๊ณ ๊ธฐ๋ ์์๋๋ก ์์ง์ด๊ธฐ์ ๋ฌผ๊ณ ๊ธฐ ๋ฒํธ์์ผ๋ก ์ ๋ ฌํ๋ค.
fishPoll.sort(Comparator.comparingInt(o -> o.index));
for (Fish fish : fishPoll) {
int fX = fish.x;
int fY = fish.y;
int fD = fish.dirIndex;
boolean find = false;
int swapX = -1, swapY = -1;
for (int i = fD; i < fD + 8 && !find; i++) { //8๋ฐฉ์, ๋ฌผ๊ณ ๊ธฐ ์ด๋๊ฒฝ๋ก ์ ํ ์ ๊น์ง
int[] tempDir = dirs[i % 8];
int mvX = fX + tempDir[0];
int mvY = fY + tempDir[1];
if (mvX < 0 || mvY < 0 || 4 <= mvY || 4 <= mvX) continue; //๋ฒ์๋ฅผ ๋์ด๊ฐ
if (mvX == sX && mvY == sY) continue; //์์ด๊ฐ ์๋ค.
find = true; //๋ฌผ๊ณ ๊ธฐ๊ฐ ์ด๋ํ ๋ฐฉํฅ์ ์ฐพ์๋ค๋ฉด
swapX = mvX;
swapY = mvY;
fish.dirIndex = i % 8; //๋ฌผ๊ณ ๊ธฐ ๋ฐฉํฅ์ด ๋ฐ๋ //์ด๊ฑธ ์ํด์ ๊ณ ์ํ์ต๋๋ค..
}
//๋ฌผ๊ณ ๊ธฐ๊ฐ ์ด๋ํ ์ ์๋ ๋ฐฉํฅ์ ์ฐพ๋๋ค ์ด๋ ์ํจ๋ค.
if (find) {
if (fishArr[swapX][swapY] != null) { //๋ ๋ฌผ๊ณ ๊ธฐ์ ์์น๋ฅผ ๋ฐ๊พผ๋ค.
Fish swappedFish = fishArr[swapX][swapY];
swappedFish.set(fX, fY);
fish.set(swapX, swapY);
fishArr[swapX][swapY] = fish;
fishArr[fX][fY] = swappedFish;
} else {// ๋น์นธ์ธ ๊ฒฝ์ฐ!
fish.set(swapX, swapY);
fishArr[swapX][swapY] = fish;
fishArr[fX][fY] = null;
}
}
}
//์์ด๊ฐ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ ๋ง๋ค ํ์ธํ๋ค.
int[] sharkDir = dirs[dir];
while (true) {
sX += sharkDir[0];
sY += sharkDir[1];
if (sX < 0 || sY < 0 || 4 <= sX || 4 <= sY) break;//๋ฒ์๋ฅผ ๋ฒ์ด๋จ
if (fishArr[sX][sY] == null) continue; //๋น์นธ์ด๋ค.
//ํด๋น ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค๋ฉด
Fish eatenFish = fishArr[sX][sY];
fishArr[sX][sY] = null;
//ํด๋ก ๋ ๋ฐฐ์ด์ ๋ณด๋ธ๋ค(๊ณ์ํด์ ๋ฌผ๊ณ ๊ธฐ์ ์์น๊ฐ ๋ณํํ๊ธฐ ๋๋ฌธ์)
dfs(cloneArr(fishArr), sX, sY, score + eatenFish.index, eatenFish.dirIndex);
fishArr[sX][sY] = eatenFish;
}
}
private static Fish[][] cloneArr(Fish[][] fishArr) {
Fish[][] cloneArr = new Fish[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
Fish fish = fishArr[i][j];
if (fish != null)
cloneArr[i][j] = new Fish(fish); //๊น์ ๋ณต์ฌ๋ฅผ ์งํํด์ผ ํ๋ค.
}
}
return cloneArr;
}
}
'๋ฐฑ์ค(boj)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA]2798 ๋ธ๋์ญ ์์ ํ์(์กฐํฉ) (0) | 2023.07.04 |
---|---|
[JAVA]1527 ๊ธ๋ฏผ์์ ๊ฐ์ (์์ ํ์) (0) | 2023.07.04 |
[JAVA]1189 ์ปด๋ฐฑํ, ์ค๋ฒ1 (0) | 2023.06.30 |
[JAVA]13904 ๊ณผ์ , greedy , ๊ณจ๋3 (0) | 2023.06.24 |
[JAVA]1002 ํฐ๋ , ๋ด์ ๊ณผ ์ธ์ (0) | 2023.06.23 |