[JAVA] BOJ λ°±μ€ 17143 λμμ
https://www.acmicpc.net/problem/17143
17143λ²: λμμ
λμμμ΄ μμ΄ λμλ₯Ό νλ κ³³μ ν¬κΈ°κ° R×CμΈ κ²©μνμΌλ‘ λνλΌ μ μλ€. 격μνμ κ° μΉΈμ (r, c)λ‘ λνλΌ μ μλ€. rμ ν, cλ μ΄μ΄κ³ , (R, C)λ μλ κ·Έλ¦Όμμ κ°μ₯ μ€λ₯Έμͺ½ μλμ μλ μΉΈμ΄λ€.
www.acmicpc.net
λ¬Έμ
λμμμ΄ μμ΄ λμλ₯Ό νλ κ³³μ ν¬κΈ°κ° R×CμΈ κ²©μνμΌλ‘ λνλΌ μ μλ€. 격μνμ κ° μΉΈμ (r, c)λ‘ λνλΌ μ μλ€. rμ ν, cλ μ΄μ΄κ³ , (R, C)λ μλ κ·Έλ¦Όμμ κ°μ₯ μ€λ₯Έμͺ½ μλμ μλ μΉΈμ΄λ€. μΉΈμλ μμ΄κ° μ΅λ ν λ§λ¦¬ λ€μ΄μμ μ μλ€. μμ΄λ ν¬κΈ°μ μλλ₯Ό κ°μ§κ³ μλ€.

λμμμ μ²μμ 1λ² μ΄μ ν μΉΈ μΌμͺ½μ μλ€. λ€μμ 1μ΄ λμ μΌμ΄λλ μΌμ΄λ©°, μλ μ ν μμλλ‘ μΌμ΄λλ€. λμμμ κ°μ₯ μ€λ₯Έμͺ½ μ΄μ μ€λ₯Έμͺ½ μΉΈμ μ΄λνλ©΄ μ΄λμ λ©μΆλ€.
- λμμμ΄ μ€λ₯Έμͺ½μΌλ‘ ν μΉΈ μ΄λνλ€.
- λμμμ΄ μλ μ΄μ μλ μμ΄ μ€μμ λ κ³Ό μ μΌ κ°κΉμ΄ μμ΄λ₯Ό μ‘λλ€. μμ΄λ₯Ό μ‘μΌλ©΄ 격μνμμ μ‘μ μμ΄κ° μ¬λΌμ§λ€.
- μμ΄κ° μ΄λνλ€.
μμ΄λ μ λ ₯μΌλ‘ μ£Όμ΄μ§ μλλ‘ μ΄λνκ³ , μλμ λ¨μλ μΉΈ/μ΄μ΄λ€. μμ΄κ° μ΄λνλ €κ³ νλ μΉΈμ΄ κ²©μνμ κ²½κ³λ₯Ό λλ κ²½μ°μλ λ°©ν₯μ λ°λλ‘ λ°κΏμ μλ ₯μ μ μ§νμ±λ‘ μ΄λνλ€.
μΌμͺ½ κ·Έλ¦Όμ μνμμ 1μ΄κ° μ§λλ©΄ μ€λ₯Έμͺ½ μνκ° λλ€. μμ΄κ° λ³΄κ³ μλ λ°©ν₯μ΄ μλμ λ°©ν₯, μΌμͺ½ μλμ μ ν μ μλ μλ ₯μ΄λ€. μΌμͺ½ μμ μμ΄λ₯Ό ꡬλΆνκΈ° μν΄ λ¬Έμλ₯Ό μ μλ€.

μμ΄κ° μ΄λμ λ§μΉ νμ ν μΉΈμ μμ΄κ° λ λ§λ¦¬ μ΄μ μμ μ μλ€. μ΄λλ ν¬κΈ°κ° κ°μ₯ ν° μμ΄κ° λλ¨Έμ§ μμ΄λ₯Ό λͺ¨λ μ‘μλ¨Ήλλ€.
λμμμ΄ μμ΄ λμλ₯Ό νλ 격μνμ μνκ° μ£Όμ΄μ‘μ λ, λμμμ΄ μ‘μ μμ΄ ν¬κΈ°μ ν©μ ꡬν΄λ³΄μ.
μ λ ₯
첫째 μ€μ 격μνμ ν¬κΈ° R, Cμ μμ΄μ μ Mμ΄ μ£Όμ΄μ§λ€. (2 ≤ R, C ≤ 100, 0 ≤ M ≤ R×C)
λμ§Έ μ€λΆν° Mκ°μ μ€μ μμ΄μ μ λ³΄κ° μ£Όμ΄μ§λ€. μμ΄μ μ 보λ λ€μ― μ μ r, c, s, d, z (1 ≤ r ≤ R, 1 ≤ c ≤ C, 0 ≤ s ≤ 1000, 1 ≤ d ≤ 4, 1 ≤ z ≤ 10000) λ‘ μ΄λ£¨μ΄μ Έ μλ€. (r, c)λ μμ΄μ μμΉ, sλ μλ ₯, dλ μ΄λ λ°©ν₯, zλ ν¬κΈ°μ΄λ€. dκ° 1μΈ κ²½μ°λ μ, 2μΈ κ²½μ°λ μλ, 3μΈ κ²½μ°λ μ€λ₯Έμͺ½, 4μΈ κ²½μ°λ μΌμͺ½μ μλ―Ένλ€.
λ μμ΄κ° κ°μ ν¬κΈ°λ₯Ό κ°λ κ²½μ°λ μκ³ , νλμ μΉΈμ λ μ΄μμ μμ΄κ° μλ κ²½μ°λ μλ€.
μΆλ ₯
λμμμ΄ μ‘μ μμ΄ ν¬κΈ°μ ν©μ μΆλ ₯νλ€.
μμ μ λ ₯ 1 볡μ¬
4 6 8
4 1 3 3 8
1 3 5 2 9
2 4 8 4 1
4 5 0 1 4
3 3 1 2 7
1 5 8 4 3
3 6 2 1 2
2 2 2 3 5
μμ μΆλ ₯ 1 볡μ¬
22
κ° μΉΈμ μΌμͺ½ μλμ μ ν μλ μλ ₯, μ€λ₯Έμͺ½ μλλ ν¬κΈ°, μΌμͺ½ μλ μμ΄λ₯Ό ꡬλΆνκΈ° μν λ¬Έμμ΄λ€. μ€λ₯Έμͺ½ μμ β€οΈλ λμμμ΄ μ‘μ λ¬Όκ³ κΈ° νμμ΄λ€.

μ΄κΈ° μν

1μ΄

2μ΄ (Eλ² μμ΄λ Bλ²μκ² λ¨Ήνλ€)

3μ΄

4μ΄

5μ΄

6μ΄
μ 체 μ½λ
import java.util.*;
import java.io.*;
class Shark{
public int r, c, s, d, z;
public Shark(int r, int c, int s, int d, int z) {
this.r = r;
this.c = c;
this.s = s;
this.d = d;
this.z = z;
}
}
public class Main {
static int R;
static int C;
static int M;
static int result;
static List<Shark> s;
static int king;
static Shark[][] sea;
static int[] dx = {0, -1, 1, 0, 0};
static int[] dy = {0, 0, 0, 1, -1}; // μ
λ ₯ μΈλ±μ€λ₯Ό λ§μΆλ €κ³
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
sea = new Shark[R][C];
int T = Integer.parseInt(st.nextToken());
s = new ArrayList<>();
for(int i=0; i<T; i++) {
st = new StringTokenizer(bf.readLine(), " ");
int r = Integer.parseInt(st.nextToken()) -1;
int c = Integer.parseInt(st.nextToken()) -1;
Shark sk = new Shark(r, c, Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
s.add(sk);
sea[r][c] = sk;
}
while(king < C) {
move_shark();
}
sb.append(result);
System.out.println(sb.toString());
}
static void move_shark() {
// λμμμ μ΄λ & μμ΄ μ¬λΌμ§
for(int i=0; i<R; i++) {
if(sea[i][king] != null) {
Shark sk = sea[i][king];
result += sk.z;
s.remove(sk);
sea[i][king] = null;
break;
}
}
// μμ΄μ μ΄λ
int nx, ny;
int size = s.size();
for(int i = size-1; i>=0; i--) {
Shark sk = s.get(i);
if(sea[sk.r][sk.c] == sk)
sea[sk.r][sk.c] = null;
for(int k=0; k<sk.s; k++) {
nx = sk.r + dx[sk.d];
ny = sk.c + dy[sk.d];
if(nx < 0 || ny < 0 || nx >= R || ny >= C) {
if(sk.d % 2 == 0) sk.d -= 1;
else sk.d += 1;
nx = sk.r + dx[sk.d];
ny = sk.c + dy[sk.d];
}
sk.r = nx; sk.c = ny;
}
if(sea[sk.r][sk.c] != null && s.indexOf(sea[sk.r][sk.c]) > i) {
if(sea[sk.r][sk.c].z > sk.z) {
s.remove(i);
}
else {s.remove(sea[sk.r][sk.c]); sea[sk.r][sk.c] = sk;}
}
else {sea[sk.r][sk.c] = sk;}
}
king ++;
}
}
ν μ€ μ© μ΄ν΄λ³΄μ!
class Shark{
public int r, c, s, d, z;
public Shark(int r, int c, int s, int d, int z) {
this.r = r;
this.c = c;
this.s = s;
this.d = d;
this.z = z;
}
}
μμ΄ ν΄λμ€λ₯Ό μ μΈνλ€.
ν, μ΄μ μμΉμ μλ ₯, μ΄λ λ°©ν₯, ν¬κΈ° μ 보λ₯Ό λ°μμ κ°μ²΄μ μ μ₯ν κ²μ΄λ€.
static int R;
static int C;
static int M;
static int result;
static List<Shark> s;
static int king;
static Shark[][] sea;
static int[] dx = {0, -1, 1, 0, 0};
static int[] dy = {0, 0, 0, 1, -1};
μ λ ₯λ°μ λ°°μ΄μ ν¬κΈ°λ₯Ό R, Cμ μ μ₯νλ€. μμ΄μ μλ Mμ μ μ₯ν΄μ€λ€. resultμ μ‘μ μμ΄ ν¬κΈ°μ ν©μ μ μ₯ν κ²μ΄λ€. sλ₯Ό ν΅ν΄ μμ΄ κ°μ²΄ 리μ€νΈλ₯Ό λ§λ€μ΄μ€λ€.
λμμμ μμΉ μ΄μ king λ³μμ μ μ₯ν΄μ€λ€.
sea λ°°μ΄μ ν΅ν΄ κ° μμΉμ μλ μμ΄λ₯Ό μ μ₯ν΄μ€λ€.
μμ΄λ μ΄ 4κ°μ§μ μ΄λλ°©ν₯μ κ°λλ° μ΄λ 1~4λ‘ μ λ ₯μ΄ λ€μ΄μ€κΈ° λλ¬Έμ λ°°μ΄μ 1~4λ‘ λ°λ‘ μ¬μ©ν μ μκ² μμμ μΈλ±μ€λ₯Ό λ§μΆμ΄μ£Όμλ€.
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
sea = new Shark[R][C];
int T = Integer.parseInt(st.nextToken());
s = new ArrayList<>();
for(int i=0; i<T; i++) {
st = new StringTokenizer(bf.readLine(), " ");
int r = Integer.parseInt(st.nextToken()) -1;
int c = Integer.parseInt(st.nextToken()) -1;
Shark sk = new Shark(r, c, Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
s.add(sk);
sea[r][c] = sk;
}
while(king < C) {
move_shark();
}
sb.append(result);
System.out.println(sb.toString());
R, Cμ κ°μ μ λ ₯ λ°λλ€. sea[r][c] μμΉμ μμ΄κ° μ‘΄μ¬νλ©΄ κ·Έ κ°μ²΄λ₯Ό μ μ₯νλ€.
λμμμ μ΄ μλ₯Ό μ΄λνλ©° μμ§μ΄κ³ 격μλ₯Ό λ²μ΄λλ©΄ λ μ΄μ λμλ₯Ό ν μ μκΈ° λλ¬Έμ λμμμ΄ Cλ³΄λ€ μμ λκΉμ§λ§ λμλ₯Ό μ§ννλ€.
static void move_shark() {
// λμμμ μ΄λ & μμ΄ μ¬λΌμ§
for(int i=0; i<R; i++) {
if(sea[i][king] != null) {
Shark sk = sea[i][king];
result += sk.z;
s.remove(sk);
sea[i][king] = null;
break;
}
}
λμμμ νμ¬ μμΉν μ΄μ κ°μ₯ κ°κΉμ΄ ν(μ¦, 0μ κ°μ₯ κ°κΉμ΄ νμ κ°μ§λ κ³³)μ μμ΄λ₯Ό μ‘λλ€. νμ μ¦κ°μν€λ©° κ·Έ μμΉμ μμ΄κ° μ‘΄μ¬νλ©΄(nullμ΄ μλλ©΄) μμ΄λ₯Ό μ΄μ°¨μ λ°°μ΄κ³Ό listμμ μ κ±°νκ³ μμ΄μ ν¬κΈ°λ₯Ό λν΄μ€λ€.
μ κ±°νλ©΄μ μ΄κΈ°νλ₯Ό ν΄μ£Όλ κ²μ μμ§ λ§μ
int nx, ny;
int size = s.size();
for(int i = size-1; i>=0; i--) {
Shark sk = s.get(i);
if(sea[sk.r][sk.c] == sk)
sea[sk.r][sk.c] = null;
for(int k=0; k<sk.s; k++) {
nx = sk.r + dx[sk.d];
ny = sk.c + dy[sk.d];
if(nx < 0 || ny < 0 || nx >= R || ny >= C) {
if(sk.d % 2 == 0) sk.d -= 1;
else sk.d += 1;
nx = sk.r + dx[sk.d];
ny = sk.c + dy[sk.d];
}
sk.r = nx; sk.c = ny;
}
μμ΄λ₯Ό μμ νλ κ³Όμ μ΄ μκΈ° λλ¬Έμ μΈλ±μ€λ₯Ό λ€μμλΆν° μ‘°μ¬ν΄μ€λ€. λν listμ ν¬κΈ°κ° κ°λ³μ μ΄κΈ° λλ¬Έμ λ³μμ κ°μ μ μ₯νμ¬ λ체νλ€.
μμ΄ κ°μ²΄λ₯Ό λ°μ μ΄μ°¨μ λ°°μ΄μμ μμ΄ κ°μ²΄λ₯Ό μ κ±°νκ³ λ€μ μ΄λ μμΉλ₯Ό μ‘°μ¬νμ¬ λμ΄κ°λ κ²½μ° λ°©ν₯μ λ°κΏκ°λ©΄μ λ€μ μμΉλ₯Ό μ§μ νλ€.
if(sea[sk.r][sk.c] != null && s.indexOf(sea[sk.r][sk.c]) > i) {
if(sea[sk.r][sk.c].z > sk.z) {
s.remove(i);
}
else {s.remove(sea[sk.r][sk.c]); sea[sk.r][sk.c] = sk;}
}
else {sea[sk.r][sk.c] = sk;}
}
king ++;
}
}
μ΄λν μμΉκ° κ²°μ λ κ²½μ° κ·Έ μμΉμ λ€λ₯Έ μμ΄κ° μ‘΄μ¬νλ©΄ & κ·Έλ¦¬κ³ κ·Έ μμ΄κ° μ΄λ² μκ°μ μ΄λν κ²μ΄λΌλ©΄? (μΈλ±μ€λ₯Ό κ±°κΎΈλ‘ μ΄λνκ³ μκΈ° λλ¬Έμ λ ν° μΈλ±μ€λ₯Ό κ°μ§ μμ΄λ λ¨Όμ μ΄λνλ κ²μΌλ‘ μ²΄ν¬ κ°λ₯νλ€.)
κ·Έλ° κ²½μ° ν¬κΈ°κ° μμ μμ΄λ₯Ό μ κ±°νλ€.
κ·Έ λ€ λμμμ μμΉλ₯Ό μ΄λν΄μ€λ€.