Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

시간이 NullNull

[JAVA] [BOJ] 17143. 낚시왕 본문

알고리즘

[JAVA] [BOJ] 17143. 낚시왕

4NIng 2019. 9. 4. 22:29

음 이전의 미생물 격리를 풀고난 뒤 바로 풀었기 때문에 똑같은 조건에서 풀었는데 생각보다 효율이 좋지 않았다.

 

이러한 방법이 있다는 것을 참고만 하고 보시는 것을 추천드립니다.

 

1. 낚시꾼은 결국 j가 0일때 부터 j가 c-1일때 까지 잡는다

2. 상어 친구들이 움직인다. 정지한 좌표가 같을 경우 크기가 큰 상어가 작은 상어를 잡아 먹는다. ( 보통 상어가 커지게 하는 데 이 문제의 경우 상어의 크기는 항상 유지 된다.)

3. HashSet을 이용하여 잡아먹힌 상어를 제외하고 다시 list에 넣는다!

 

이 문제가 살짝 어려운 경우 이전 포스트인 미생물 격리를 한번 보고 온다면 이 설명이 더 편하게 이해가 갈 것이다.

예전과 다르게 왜 Queue가 아닌 list를 썼느냐고 물어본다면 예전에는 움직이고 서로 잡아먹는 것이 끝이었다면 지금은 낚시꾼이 잡는 것도 포함되어 list를 사용하였고 이를 clear 해주는 것에 시간이 조금 걸린 것 같다.

 

Arrays.fill을 조금 더 편하게 쓰기 위해 [i][j] 를 i * c + j 로 나타내었는데 이것 또한 저는 많이 쓰기도 하고 이해가 가지 않을 경우 본인이 종이에 각 좌표를 써놓고 0,0 은 0 / 0,1 은 1 이런 식으로 차례로 쓴다음 i 와 j 그리고 가로길이 c에 대해서 생각해본다면 더 알기 쉽다고 생각이 든다.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashSet;

public class Main17143 {
	static class Shark{
		int i, j, speed, dir, size;
		public Shark(int i, int j, int speed, int dir, int size) {
			this.i = i;
			this.j = j;
			this.speed = speed;
			this.dir = dir;
			this.size = size;
		}
	}
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		String[] str = br.readLine().split(" ");
		int r = Integer.parseInt(str[0]);
		int c = Integer.parseInt(str[1]);
		int m = Integer.parseInt(str[2]);
		ArrayList<Shark> list = new ArrayList<Shark>();
		HashSet<Integer> hs = new HashSet<Integer>();
		int[] dx = {-1, 1, 1, -1};
		int di = 0;
		int dj = 0;
		int size = 0;
		int dir = 0;
		int speed = 0;
		int sumSize = 0;
		int[] sizeMap = new int[r*c];
		int[] dirMap = new int[r*c];
		int[] speedMap = new int[r*c];
		for(int i=0; i<m; ++i) {
			str = br.readLine().split(" ");
			di = Integer.parseInt(str[0])-1;
			dj = Integer.parseInt(str[1])-1;
			speed = Integer.parseInt(str[2]);
			dir = Integer.parseInt(str[3]);
			size = Integer.parseInt(str[4]);
			list.add(new Shark(di, dj, speed, dir, size));
		}
		int idx = 0;
		int minI = Integer.MAX_VALUE;
		Shark s = null;
		for(int j=0; j<c; ++j) {			
			hs.clear();
			idx = -1;
			minI = Integer.MAX_VALUE;
			
			for(int i=0; i<list.size(); ++i) {
				s = list.get(i);
				di = s.i;
				dj = s.j;
				speed = s.speed;
				dir = s.dir;
				size = s.size;
				if(dj == j && di < minI) {
					minI = di;
					idx = i;
				}
				//1. 위 / 2. 아래 / 3. 오른쪽 / 4. 왼쪽
				if(dir == 1) {
					for(int k=0; k<speed; ++k) {
						di += dx[dir-1];
						if(di < 0 ) {
							dir = 2;
							di = 1;
						}else if(di >= r) {
							dir = 1;
							di = r-2;
						}
					}
				}else if(dir == 2){
					for(int k=0; k<speed; ++k) {
						di += dx[dir-1];
						if(di < 0 ) {
							dir = 2;
							di = 1;
						}else if(di >= r) {
							dir = 1;
							di = r-2;
						}
					}
				}else if(dir == 3) {
					for(int k=0; k<speed; ++k) {
						dj += dx[dir-1];
						if(dj < 0 ) {
							dir = 3;
							dj = 1;
						}else if(dj >= c) {
							dir = 4;
							dj = c-2;
						}
					}
				}else if(dir == 4) {
					for(int k=0; k<speed; ++k) {
						dj += dx[dir-1];
						if(dj < 0 ) {
							dir = 3;
							dj = 1;
						}else if(dj >= c) {
							dir = 4;
							dj = c-2;
						}
					}
				}
				s.i = di;
				s.j = dj;
				s.dir = dir;
				
			}
			for(int i=0; i<list.size(); ++i) {
				if(i == idx) {
					sumSize += list.get(i).size;
					continue;
				}
				s = list.get(i);
				di = s.i;
				dj = s.j;
				speed = s.speed;
				dir = s.dir;
				size = s.size;
				if(sizeMap[di*c+dj] < size) {
					sizeMap[di*c+dj] = size;
					dirMap[di*c+dj] = dir;
					speedMap[di*c+dj] = speed;
				}
				hs.add(di*c+dj);
			}
			list.clear();
			for(int value : hs) {
				di = value/c;
				dj = value%c;
				list.add(new Shark(di, dj, speedMap[di*c+dj], dirMap[di*c+dj], sizeMap[di*c+dj]));
				speedMap[di*c+dj] = 0;
				dirMap[di*c+dj] = 0;
				sizeMap[di*c+dj] = 0;
			}
		}
		bw.write(""+sumSize);
		bw.close();
		br.close();
	}

}

'알고리즘' 카테고리의 다른 글

[JAVA] [SWEA] 9088. 다이아몬드  (0) 2020.01.11
[JAVA] [SWEA] 5648. 원자 소멸 시뮬레이션  (0) 2019.09.04
[JAVA] [SWEA] 2382. 미생물 격리  (0) 2019.09.04
[JAVA] [KAKAO] 셔틀버스  (0) 2019.09.04
[JAVA] [KAKAO] 자동완성  (0) 2019.09.04
Comments