728x90
상어가 이동방향로 속력만큼 이동할 때 낚시꾼이 잡은 물고기의 합을 구하는 문제입니다.
낚시꾼은 1~c까지 차례대로 가장 가까운 곳에 곳에 있는 물고기를 잡습니다. (y가 같아야 함)
물고기는 큰 물고기가 작은 물고기와 같은 곳에 있다면 큰 물고기가 작은 물고기를 잡아먹습니다.
1. 낚시꾼이 잡을 수 있는 가까운 물고기가 있다면 잡기
2. 물고기 이동
3. 같은 위치 물고기 잡아먹기
4. 낚시꾼 한칸 이동
위의 과정을 낚시꾼이 c가 될때까지 반복한 후 잡은 물고기 크기의 합을 출력합니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int ans = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] map = new int[r+1][c+1];
Queue<Shark> q = new LinkedList<>();
Shark[] sharkSort = new Shark[m];
Shark shark;
for(int i=0; i<m; ++i) {
st = new StringTokenizer(br.readLine());
int sr = Integer.parseInt(st.nextToken()); //y
int sc = Integer.parseInt(st.nextToken()); //x
int ss = Integer.parseInt(st.nextToken()); //속력
int sd = Integer.parseInt(st.nextToken()); //방향
int sz = Integer.parseInt(st.nextToken()); //크기
if (sd == 3 || sd == 4) {
ss = ss % (2 * (c - 1));
}
else if(sd == 1 || sd == 2) {
ss = ss % (2 * (r - 1));
}
shark = new Shark(sr, sc, ss, sd, sz);
map[sr][sc] = sz;
sharkSort[i] = shark;
}
Arrays.sort(sharkSort, (o1, o2) -> -(o1.z-o2.z));
for(int i=0; i<sharkSort.length; ++i) {
q.add(sharkSort[i]);
}
for(int loc=1; loc<=c; ++loc) {
int size = q.size();
int catchShark = 0;
for(int i=1; i<=r; ++i) {
if(map[i][loc] != 0) {
ans += map[i][loc];
catchShark = map[i][loc];
break;
}
}
initMap(r, c, map);
for(int s=0; s<size; ++s) {
shark = q.poll();
if(shark.z == catchShark) {
continue;
}
if(shark.d == 1) { //위
shark.r -= shark.s;
if(shark.r <= 0) {
shark.r = Math.abs(shark.r-2);
shark.d = 2;
}
if(shark.r > r) {
shark.r = r - (shark.r - r);
shark.d = 1;
}
if(shark.r <= 0) {
shark.r = Math.abs(shark.r-2);
shark.d = 2;
}
} else if(shark.d == 2) { //아래
shark.r += shark.s;
if(shark.r > r) {
shark.r = r - (shark.r - r);
shark.d = 1;
}
if(shark.r <= 0) {
shark.r = Math.abs(shark.r-2);
shark.d = 2;
}
if(shark.r > r) {
shark.r = r - (shark.r - r);
shark.d = 1;
}
} else if(shark.d == 3) { //오른쪽
shark.c += shark.s;
if(shark.c > c) {
shark.c = c - (shark.c - c);
shark.d = 4;
}
if(shark.c <= 0) {
shark.c = Math.abs(shark.c-2);
shark.d = 3;
}
if(shark.c > c) {
shark.c = c - (shark.c - c);
shark.d = 4;
}
} else if(shark.d == 4) { //왼쪽
shark.c -= shark.s;
if(shark.c <= 0) {
shark.c = Math.abs(shark.c-2);
shark.d = 3;
}
if(shark.c > c) {
shark.c = c - (shark.c - c);
shark.d = 4;
}
if(shark.c <= 0) {
shark.c = Math.abs(shark.c-2);
shark.d = 3;
}
}
if(map[shark.r][shark.c] == 0) {
q.add(shark);
map[shark.r][shark.c] = shark.z;
}
}
}
bw.write(ans + "");
bw.close();
}
public static void initMap(int r, int c, int[][] map) {
for(int i=1; i<=r; ++i) {
for(int j=1; j<=c; ++j) {
map[i][j] = 0;
}
}
}
public static class Shark {
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;
}
}
}
'알고리즘' 카테고리의 다른 글
[Java] 백준 2563번 색종이 (0) | 2023.02.16 |
---|---|
[Java] SWEA - Spot Mart (0) | 2023.02.14 |
[Java] 백준 1235번 학생 번호 (0) | 2023.02.13 |
[Java] 백준 2493번 탑 (0) | 2023.02.13 |
[Java] 백준 17144번 미세먼지 안녕! (0) | 2023.02.13 |