๐ ๋ฌธ์
https://www.acmicpc.net/problem/17143
๐ ์์ด๋์ด
๋ฐฐ์ด์ ์ฌ์ด์ฆ๊ฐ ์์์ ๊ทธ๋ฅ ๋ฐฐ์ด๋ก ์ ์ฅํ์ฌ ์ฐพ๋ ๋ฐฉ๋ฒ์ ์ ํํ์๋ค.
ํด๋น๋ฌธ์ ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ ํฌ์ธํธ๋ ์์ด์ ์๋๋ผ๊ณ ํ๋จํ์ฌ ํด๋น ๋ถ๋ถ์ ๋ฐ๋ก ์ฒ๋ฆฌํด ์ฃผ์๋ค.
์์ด์ ๋ฐฉํฅ์ด ์ค๋ฅธ์ชฝ ์ผ์ชฝ์ธ ๊ฒฝ์ฐ, ์์๋์ธ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌํ์๋ค.
๋จผ์ ์ค๋ฅธ์ชฝ, ์๋์ชฝ์ธ ๊ฒฝ์ฐ๋ velocity๋งํผ ๋ํ๊ณ , ์ผ์ชฝ ์์ชฝ์ธ ๊ฒฝ์ฐ์๋ velocity๋งํผ ๋บ๋ค.
๋ง์ฝ ์ ์๋์ ๊ฒฝ์ฐ๋ง ๊ณ์ฐํ๋ค๊ณ ์๊ฐํ๋ฉด
์์ด๊ฐ ํด๋น ์๋ฆฌ๋ก ๋์ผํ ๋ฐฉํฅ์ผ๋ก ๋์์ค๋ ๊ฒฝ์ฐ๋ 2*(R-1)์ธ ๊ฒฝ์ฐ ๋์ผํ๊ฒ ๋์์ค๊ธฐ ๋๋ฌธ์ ๋๋จธ์ง๋ง ์ด์ฉํ๊ธฐ ์ํด ๋ชจ๋๋ฌ ์ฐ์ฐ์ ํ๋ค.
๋ง์ฝ ์ซ์๊ฐ ์์์ธ ๊ฒฝ์ฐ์๋ ์ ๋๊ฐ์ ์ทจํด์ ๊ณ์ฐํ๋ค. (๋์ถฉ ์ํ์ผ๋ก ๋์๊ฐ๋ ๋๋์ผ๋ก ์๊ฐํ๋ฉด ๋๋ค)
๋์ถฉ ์๋์ ๊ฐ์ด ๊ฐ ์นธ์ ๋ฐฉํฅ์ ๋ฐ๋ผ ์ซ์๋ฅผ ๊ฐ์ง๋ค๊ณ ์๊ฐํ๊ณ ๋ฌธ์ ๋ฅผ ์ ๊ทผํ์ฌ ํ์๋ค.
0 | ์๋์ชฝ 0 ์์ชฝ 6 |
1 | ์๋์ชฝ 1 ์์ชฝ 5 |
2 | ์๋์ชฝ 2 ์์ชฝ 4 |
3 | 3(์์ชฝ, ์๋์ชฝ) |
๋ง์ง๋ง์ผ๋ก ํ์ฌ ์์น๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์
R๋ณด๋ค ์์ผ๋ฉด ์๋์ชฝ์ผ๋ก ๊ฐ๋ ๋ฐฉํฅ
R๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์์ชฝ์ผ๋ก ์ฌ๋ผ๊ฐ๋ ๋ฐฉํฅ์ด๊ณ , (R)-(ํ์ฌ์ซ์ - R)์ผ๋ก ๊ณ์ฐํ๋ฉด ๋๋ค.
ํด๋น ๋ฌธ์ ์์๋ ์นธ์ด 0๋ถํฐ ์์ํด์ (R-1)- (next - (R -1)) ์ฌ์ R-1+R-1-next = 2*R-2-next๋ก ๊ณ์ฐํ์๋ค.
์, ์๋์ชฝ์ ๊ตฌํ๋ ํ์ด์ ๋์ผํ๊ฒ ์ผ์ชฝ์ค๋ฅธ์ชฝ์ ๊ตฌํ๋ ๋ฉ์๋๋ ๊ตฌํํ์๋ค.
์๋ฃ ํ์๋ ํด๋น ์์น๋ฅผ temp ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค
์ด๋ ๋ง์ฝ ์ด์ ์ temp์ ํ์ฌ ์์ด๊ฐ ์ ์ฅ๋ ์์น์ ์์ ๋ณด๋ค ๊ฐ๋ฒผ์ด ์น๊ตฌ๊ฐ ์๋ค๋ฉด ํ์ฌ ์์ด๋ฅผ ๋ฃ๊ณ ์ง๋๊ฐ๋ค.
์ด๋ ๊ฒ ํ ์ฐจ๋ก๊ฐ ๋๋ ํ์๋ map=temp๋ฅผ ํ์ฌ map์ ๊ฐฑ์ ํด ์ค๋ค.
๐ ํ์ด
package ๋ฐฑ์ค;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class boj_17143_๊ตฌํ_์์ด {
private static class Shark {
public int velocity;
public int dir;
public int weight;
public Shark(int velocity, int dir, int weight) {
this.velocity = velocity;
this.dir = dir;
this.weight = weight;
}
}
private static int R;
private static int C;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
Shark[][] map = new Shark[R][C];
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken()) - 1;
int c = Integer.parseInt(st.nextToken()) - 1;
int s = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken()) ;
int z = Integer.parseInt(st.nextToken());
map[r][c] = new Shark(s, d, z);
}
if (m == 0) {
System.out.println(0);
return;
}
//์ฌ๋์ด ์ด๋ํ๋ค.
long sum = 0;
for (int i = 0; i < C; i++) {
//1 ์์ด ์ก๊ธฐ
for (int j = 0; j < R; j++) {
if (map[j][i] != null) {
sum += map[j][i].weight;
map[j][i] = null;
break;
}
}
//2 ์์ด๋ค ์ด๋
Shark[][] temp = new Shark[R][C];
for (int p = 0; p < R; p++) {
for (int q = 0; q < C; q++) {
if (map[p][q] != null) {
Shark shark = map[p][q];
int[] mv = null;
switch (map[p][q].dir) {
case 1:
case 2://์์ชฝ ์๋
mv = findNextRowLocal(p, q, shark);
break;
case 3:
case 4://์ค ์ผ
mv = findNextColLocal(p, q, shark);
break;
}
if (temp[mv[0]][mv[1]] == null) {
temp[mv[0]][mv[1]] = shark;
} else if (temp[mv[0]][mv[1]].weight < shark.weight) { //๋ ๋ฌด๊ฑฐ์ด ์์ด๋ก ๋ฐ๊พผ๋ค
temp[mv[0]][mv[1]] = shark;
}
}
}
}
map = temp;
}
System.out.println(sum);
}
private static int[] findNextRowLocal(int i, int j, Shark shark) {//์ ์๋
int next = (shark.dir == 1) ? i - shark.velocity : i + shark.velocity; // 1์ธ ๊ฒฝ์ฐ ์์ชฝ, 2์ธ ๊ฒฝ์ฐ ์๋์ชฝ
if (next <= 0 || R - 1 <= next) {
next = Math.abs(next);
next %= (2 * R - 2); //ํ๋ฐํด๋ฅผ ๋๋ ๊ฒฝ์ฐ ํ์ฌ ์ํ์ ์ผ์นํ๊ธฐ๋๋ฌธ์
if (next < R) {
shark.dir = 2; //์๋์ชฝ
} else {
next = (2 * R - next - 2);
shark.dir = 1; //์์ชฝ(ํ ๋ฐํด๋ฅผ ๋์ด๊ฐ์)
}
}
return new int[]{next, j};
}
private static int[] findNextColLocal(int i, int j, Shark shark) { //์ค ์ผ
int next = (shark.dir == 4) ? j - shark.velocity : j + shark.velocity; //3์ธ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ, 4์ธ๊ฒฝ์ฐ ์ธ์ชฝ
if (next <= 0 || C - 1 <= next) {
next = Math.abs(next);
next %= (2 * C - 2); //ํ๋ฐํด๋ฅผ ๋๋ ๊ฒฝ์ฐ ํ์ฌ ์ํ์ ์ผ์นํ๊ธฐ๋๋ฌธ์
if (next < C) {
shark.dir = 3; //์ค๋ฅธ์ชฝ
} else {
next = (2 * C - next - 2);
shark.dir = 4; //์ผ์ชฝ(ํ๋ฐํด๋ฅผ ๋์ด๊ฐ)
}
}
return new int[]{i, next};
}
}
์๋๋ ์ฃผ์์ ํ๋ฉด ์์ด์ ์ํ๋ฅผ ์ง๊ด์ ์ผ๋ก ํ์ธํ ์ ์์ด ์ถ๊ฐํ์๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static class Shark {
public int velocity;
public int dir;
public int weight;
public Shark(int velocity, int dir, int weight) {
this.velocity = velocity;
this.dir = dir;
this.weight = weight;
}
// @Override
// public String toString() {
// return "Shark{" +
// "velocity=" + velocity +
// ", dir=" + dir +
// ", weight=" + weight +
// '}';
// }
}
private static int R, C, M;
private static Shark[][] map;
private static Shark[][] temp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new Shark[R][C];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken()) - 1;
int c = Integer.parseInt(st.nextToken()) - 1;
int s = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken()) ;
int z = Integer.parseInt(st.nextToken());
map[r][c] = new Shark(s, d, z);
}
// System.out.println("START");
// for (int p = 0; p < R; p++) {
// for (int q = 0; q < C; q++) {
// if (map[p][q] == null) {
// System.out.printf("%35s", "No |");
// } else System.out.printf("%s|", map[p][q]);
// }
// System.out.println();
// }
// System.out.println("------------------------------------------------------------------------------------------------");
if (M == 0) {
System.out.println(0);
return;
}
//์ฌ๋์ด ์ด๋ํ๋ค.
long sum = 0;
for (int i = 0; i < C; i++) {
//1 ์์ด ์ก๊ธฐ
for (int j = 0; j < R; j++) {
if (map[j][i] != null) {
sum += map[j][i].weight;
map[j][i] = null;
break;
}
}
temp = new Shark[R][C];
//2 ์์ด๋ค ์ด๋
Shark[][] temp = new Shark[R][C];
for (int p = 0; p < R; p++) {
for (int q = 0; q < C; q++) {
if (map[p][q] != null) {
Shark shark = map[p][q];
int[] mv = null;
switch (map[p][q].dir) {
case 1:
case 2://์์ชฝ ์๋:
mv = findNextRowLocal(p, q, shark);
break;
case 3:
case 4://์ผ dh
mv = findNextColLocal(p, q, shark);
break;
}
if (temp[mv[0]][mv[1]] == null) {
temp[mv[0]][mv[1]] = shark;
} else if (temp[mv[0]][mv[1]].weight < shark.weight) { //๋ ๋ฌด๊ฑฐ์ด ์์ด๋ก ๋ฐ๊พผ๋ค
temp[mv[0]][mv[1]] = shark;
}
}
}
}
// System.out.println("col : " + i);
// for (int p = 0; p < R; p++) {
// for (int q = 0; q < C; q++) {
// if (temp[p][q] == null) {
// System.out.printf("%35s", "No |");
// } else System.out.printf("%s|", temp[p][q]);
// }
// System.out.println();
// }
// System.out.println(sum);
// System.out.println("------------------------------------------------------------------------------------------------");
map = temp;
}
System.out.println(sum);
}
private static int[] findNextRowLocal(int i, int j, Shark shark) {//์ ์๋
int next = (shark.dir == 1) ? i - shark.velocity : i + shark.velocity; // 1์ธ ๊ฒฝ์ฐ ์์ชฝ, 2์ธ ๊ฒฝ์ฐ ์๋์ชฝ
if (next <= 0 || R - 1 <= next) {
next = Math.abs(next);
next %= (2 * R - 2); //ํ๋ฐํด๋ฅผ ๋๋ ๊ฒฝ์ฐ ํ์ฌ ์ํ์ ์ผ์นํ๊ธฐ๋๋ฌธ์
if (next < R) {
shark.dir = 2; //์๋์ชฝ
} else {
next = (2 * R - next - 2);
shark.dir = 1; //์์ชฝ(ํ ๋ฐํด๋ฅผ ๋์ด๊ฐ์)
}
}
return new int[]{next, j};
}
private static int[] findNextColLocal(int i, int j, Shark shark) { //์ค ์ผ
int next = (shark.dir == 4) ? j - shark.velocity : j + shark.velocity; //3์ธ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ, 4์ธ๊ฒฝ์ฐ ์ธ์ชฝ
if (next <= 0 || C - 1 <= next) {
next = Math.abs(next);
next %= (2 * C - 2); //ํ๋ฐํด๋ฅผ ๋๋ ๊ฒฝ์ฐ ํ์ฌ ์ํ์ ์ผ์นํ๊ธฐ๋๋ฌธ์
if (next < C) {
shark.dir = 3; //์ค๋ฅธ์ชฝ
} else {
next = (2 * C - next - 2);
shark.dir = 4; //์ผ์ชฝ(ํ๋ฐํด๋ฅผ ๋์ด๊ฐ)
}
}
return new int[]{i, next};
}
}
'๋ฐฑ์ค(boj)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA]2847 ๊ฒ์์ ๋ง๋ ๋์ค์ด, ๊ทธ๋ฆฌ๋, ์ค๋ฒ4 (0) | 2023.06.01 |
---|---|
[JAVA]1063 ํน, ๊ตฌํ, ์ค๋ฒ3 (0) | 2023.05.31 |
[JAVA]2758 ๋ก๋(dfs ์๊ฐ์ด๊ณผ/ dp) (0) | 2023.05.28 |
[๋ฐฑ์ค Java] 4963 ์ฌ์ ๊ฐ์ (0) | 2023.05.26 |
[JAVA]1092 ๋ฐฐ ( ์ด๋ถ ํ์ ) (0) | 2023.05.23 |