

내가 생각했을때 문제에서 원하는부분
첫째 줄에 격자판의 크기 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인 경우는 왼쪽을 의미한다.
두 상어가 같은 크기를 갖는 경우는 없고, 하나의 칸에 둘 이상의 상어가 있는 경우는 없다.
낚시왕이 잡은 상어 크기의 합을 출력한다.
내가 이 문제를 보고 생각해본 부분
Shark 클래스: 상어 정보를 저장하는 데 사용한다.
위치(r,c), 속도(s), 방향(d), 크기(z)를 가진 객체이다.
입력받을 때 상어의 속력을 한 주기 내에서만 계산하도록 모듈로 연산해 최적화했다.
예를 들어, 위아래 이동 주기는 (R − 1) \ * 2 칸입니다.
낚시왕이 열을 1부터 C까지 이동하면서,
해당 열에서 가장 위에 있는 상어를 찾아 크기를 더하고 제거한다.
그 후 모든 상어를 이동시킵니다. 상어 하나하나에 대하여 속도만큼 좌표를 이동시키고, 경계를 만나면 방향을 반대로 바꾼다.
이동 완료 후 상어의 위치가 겹치면 크기 큰 상어만 남기도록 새 배열을 만든다.
모든 칼럼을 다 지나가면 낚시왕이 잡은 상어 크기 합을 출력한다.
코드로 구현
package baekjoon.baekjoon_33;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 17143번 문제
public class Main1337 {
static class Shark {
int r, c, s, d, z;
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, C, M;
static Shark[][] map;
static int[] dr = {0, -1, 1, 0, 0}; // 상(1), 하(2), 우(3), 좌(4)
static int[] dc = {0, 0, 0, 1, -1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new Shark[R + 1][C + 1];
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
int z = Integer.parseInt(st.nextToken());
// 속도 최적화: 수직 이동은 (R - 1) *2가 한 주기, 수평 이동은 (C - 1) *2가 한 주기
if(d == 1 || d == 2) {
s = s % ((R - 1) * 2);
} else {
s = s % ((C - 1) * 2);
}
map[r][c] = new Shark(r, c, s, d, z);
}
int answer = 0;
// 낚시왕이 1~C 열까지 이동
for(int col = 1; col <= C; col++) {
// 1. 낚시왕 위치한 열에서 가장 위에 있는 상어 잡기
for(int row = 1; row <= R; row++) {
if(map[row][col] != null) {
answer += map[row][col].z;
map[row][col] = null;
break;
}
}
// 2. 상어 이동
Shark[][] newMap = new Shark[R + 1][C + 1];
for(int r = 1; r <= R; r++) {
for(int c = 1; c <= C; c++) {
if(map[r][c] != null) {
Shark sh = map[r][c];
int nr = sh.r;
int nc = sh.c;
int nd = sh.d;
int speed = sh.s;
// 상어 이동
if(nd == 1 || nd == 2) { // 수직 이동 (상/하)
for(int move = 0; move < speed; move++) {
if(nr == 1 && nd == 1)
nd = 2;
else if(nr == R && nd == 2)
nd = 1;
nr += dr[nd];
}
} else { // 수평 이동 (우/좌)
for(int move = 0; move < speed; move++) {
if(nc == 1 && nd == 4)
nd = 3;
else if(nc == C && nd == 3)
nd = 4;
nc += dc[nd];
}
}
// 같은 칸에 있으면 큰 상어가 먹음
if(newMap[nr][nc] == null || newMap[nr][nc].z < sh.z) {
newMap[nr][nc] = new Shark(nr, nc, sh.s, nd, sh.z);
}
}
}
}
map = newMap;
}
System.out.println(answer);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.