[알고리즘] Java / 백준 / 낚시왕 / 17143

정현명·2022년 4월 13일
0

baekjoon

목록 보기
138/180
post-thumbnail

[알고리즘] Java / 백준 / 낚시왕 / 17143

문제


문제 링크



접근 방식




코드


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;

public class Main_17143_정현명 {

	public static class Shark{
		int num;
		int r;
		int c;
		int speed;
		int dir;
		int size;
		
		public Shark(int num, int r, int c, int speed, int dir, int size) {
			super();
			this.num = num;
			this.r = r;
			this.c = c;
			this.speed = speed;
			this.dir = dir;
			this.size = size;
		}
	}
	
	static int R,C,M;
	static HashMap<Integer,Shark> sharks;
	static int[][] map;
	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());
		
		sharks = new HashMap<>();
		
		map = new int[R+1][C+1];
		for(int i=1;i<=M;i++) {
			st = new StringTokenizer(br.readLine());
			int r = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());
			int speed = Integer.parseInt(st.nextToken());
			int dir = Integer.parseInt(st.nextToken());
			int size = Integer.parseInt(st.nextToken());
			
			map[r][c] = i;
			
			sharks.put(i,new Shark(i,r,c,speed,dir,size));
		}
		
		System.out.println(go());
		
	}
	
	static int[] dr = {0,-1,1,0,0};
	static int[] dc = {0,0,0,1,-1};
	
	public static int go() {
		int sizeSum = 0; // 낚시왕이 잡은 상어 크기 합
		
		// 시뮬레이션 시작
		for(int king=1;king<=C;king++) {
			
			
			// 낚시왕 열 이동
			// 낚시왕의 열에 있는 상어 탐색
			for(int r=1;r<=R;r++) {
				// 낚시왕이 있는 열에 가장 가까운 상어를 찾을 경우
				if(map[r][king] != 0) {
					// 해당 상어를 잡고 맵에서 없앤다.
					sizeSum+= sharks.get(map[r][king]).size;
					sharks.remove(map[r][king]);
					map[r][king] = 0;
					break;
				}
			}
			
			for(int r=1;r<=R;r++) {
				for(int c=1;c<=C;c++) {
					map[r][c] = 0;
				}
			}
			// 상어 이동
			for(Shark shark : sharks.values()) {
				int moveCnt = shark.speed;
				// 상하로 이동하면 
				if(shark.dir<=2) moveCnt %= R*2-2;
				// 좌우로 이동하면
				else moveCnt %= C*2-2;
				for(int move=0;move<moveCnt;move++) {
					int nR = shark.r + dr[shark.dir];
					int nC = shark.c + dc[shark.dir];
					if(nR <1 || nR>R || nC<1 || nC>C) {
						if(shark.dir == 1) shark.dir = 2;
						else if(shark.dir == 2) shark.dir = 1;
						else if(shark.dir == 3) shark.dir = 4;
						else shark.dir = 3;
						
						nR = shark.r + dr[shark.dir];
						nC = shark.c + dc[shark.dir];
					}
					
					shark.r =nR;
					shark.c =nC;
				}
			}
			
			if(sharks.size() != 0) {
				List<Integer> deleteList = new ArrayList<>();
				for(Shark shark : sharks.values()) {
					if(map[shark.r][shark.c] == 0) {
						map[shark.r][shark.c]= shark.num;
					}
					else if(map[shark.r][shark.c]!= 0 ) {
						if(sharks.get(map[shark.r][shark.c]).size < shark.size) {
							deleteList.add(map[shark.r][shark.c]);
							map[shark.r][shark.c] = shark.num;
						}else {
							deleteList.add(shark.num);
						}
					}
				}
				
				for(int i=0;i<deleteList.size();i++) {
					sharks.remove(deleteList.get(i));
				}
			}
			
			
		}
		return sizeSum;
	}
	

}
profile
꾸준함, 책임감

0개의 댓글