끄적끄적 코딩
article thumbnail
Published 2023. 2. 14. 22:19
[Java] 백준 17143번 낚시왕 알고리즘
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

검색 태그