사용한 것
- 상어를 나타내는
Shark
와 낚시터를 나타내는 Shark
2차원 배열 sharks
풀이 방법
- 컬럼을 순회하며
- 낚시꾼 한칸 이동
- 현재 컬럼에서 가장 가까운 상어 잡기
- 상어 이동
stack
을 사용해서 이동시킴
s
를 (R
혹은 C
- 1) * 2 만큼 나머지 연산 (자기 자리로 되돌아오는 경우 배제하여 연산 최적화)
stack
을 pop()
하며 이미 이동된 상어가 있으면 크기 따지기
코드
public class Main {
private static int R;
private static int C;
private static int M;
private static Shark[][] sharks;
public static void main(String[] args) throws IOException {
init();
System.out.println(findSumOfSizes());
}
private static void init() 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());
M = Integer.parseInt(st.nextToken());
sharks = new Shark[R + 1][C + 1];
int r, c, s, d, z;
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
s = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
z = Integer.parseInt(st.nextToken());
sharks[r][c] = new Shark(r, c, s, d, z);
}
br.close();
}
private static int findSumOfSizes() {
int sum = 0;
int idx = 0;
for (int i = 1; i <= C; i++) {
idx++;
sum += catchNearestOne(idx);
move();
}
return sum;
}
private static int catchNearestOne(int idx) {
int size = 0;
for (int i = 1; i <= R; i++) {
Shark shark = sharks[i][idx];
if (shark != null) {
size = shark.z;
sharks[i][idx] = null;
break;
}
}
return size;
}
private static void move() {
Shark shark;
Stack<Shark> stack = new Stack<>();
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
shark = sharks[i][j];
if (shark != null) {
shark.move(R, C);
stack.push(shark);
sharks[i][j] = null;
}
}
}
Shark preShark;
while (!stack.isEmpty()) {
shark = stack.pop();
preShark = sharks[shark.r][shark.c];
if (preShark == null || shark.z > preShark.z) {
sharks[shark.r][shark.c] = shark;
}
}
}
}
class Shark {
public int r;
public int c;
public int s;
public int d;
public int 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 void move(int R, int C) {
int customS = s % (((d < 3 ? R : C) - 1) * 2);
for (int i = 0; i < customS; i++) {
if (d == 1 && r == 1) {
d = 2;
} else if (d == 2 && r == R) {
d = 1;
} else if (d == 3 && c == C) {
d = 4;
} else if (d == 4 && c == 1) {
d = 3;
}
if (d == 1) {
r--;
} else if (d == 2) {
r++;
} else if (d == 3) {
c++;
} else {
c--;
}
}
}
}