17143 낚시왕 - 삼성 sw 역량 기출
R x C 격자판에 상어가 있다. (1,1) ~ (R,C)
상어는 크기와 속도를 가지고 있다.
낚시꾼은 0행에서 오른쪽으로 이동하고 가장 오른쪽 열에서 멈춘다.
낚시 절차
- 낚시왕이 오른쪽으로 한 칸 이동한다.
- 낚시왕이 있는 열에 있는 상어 중 가장 가까운 상어를 잡는다. 잡은 상어는 사라진다.
- 상어가 이동한다.
상어는 주어진 속도로 칸을 이동한다.
경계에 다다른 경우에는 방향을 반대로 바꿔서 이동한다.
풀이
-
상어를 객체를 만든다. (r, c, s, d, z)
-
초기 map과 초기 list에 모든 상어의 상태를 저장해준다.
-
상어 이동 메소드를 구현한다. -
moveShark
-
파라미터로 상어 객체와 그 객체의 속도를 받는다.
-
속도가 0이 될 때까지 재귀
-
각 방향에 while 반복을 하면서 속도가 0이 되거나 위치가 경계면에 다다르면 break해준다.
-
-
for문으로 낚시꾼을 열 방향으로 이동시킨다.
-
for문으로 행이동하며 map이 null이 아니면 상어의 크기를 저장하고 상어를 제거한 뒤 break해준다.
-
arraylist를 초기화하고 현재 map의 상어들을 다시 저장한다. -
list
-
새로운 arraylist를 생성하여 moveShark메소드의 결과 상어들을 저장한다. -
moveList
-
moveList
의 상어들을 초기화 한 map에 저장한다- 이미 상어가 있으면 크기 비교를 한 뒤 큰 것을 저장한다.
-
map에 남은 상어들을 다시
list
에 저장해 준다.
-
-
누적된 상어의 크기를 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main낚시왕 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st1 = new StringTokenizer(br.readLine());
R = Integer.parseInt(st1.nextToken());
C = Integer.parseInt(st1.nextToken());
int M = Integer.parseInt(st1.nextToken());
List<Shark> list = new ArrayList<Shark>();
Shark[][] map = new Shark[R+1][C+1];
for(int i = 0; i < M; i++) {
StringTokenizer st2 = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st2.nextToken());
int c = Integer.parseInt(st2.nextToken());
int s = Integer.parseInt(st2.nextToken());
int d = Integer.parseInt(st2.nextToken());
int z = Integer.parseInt(st2.nextToken());
Shark shark = new Shark(r, c, s, d, z);
list.add(shark);
map[r][c] = shark;
}
int sum = 0;
for(int j = 1; j <= C; j++) {
//상어 잡기
for(int i = 1; i <= R; i++) {
if(map[i][j]!=null) {
sum += map[i][j].z;
map[i][j] = null;
break;
}
}
list = new ArrayList<Shark>();
for(int k = 1; k <= R; k++ ) {
for(int l = 1; l <= C; l++) {
if(map[k][l] != null) {
list.add(map[k][l]);
}
}
}
//상어 이동
moveList = new ArrayList<Shark>();
for(int k = 0; k < list.size(); k++) {
Shark shark = list.get(k);
moveShark(shark, shark.s);
}
map= new Shark[R+1][C+1];
for(int k = 0; k < moveList.size(); k++) {
Shark shark = moveList.get(k);
if(map[shark.r][shark.c] == null) {
map[shark.r][shark.c] = shark;
}else {
if(map[shark.r][shark.c].z <= shark.z) {
map[shark.r][shark.c] = shark;
}
}
}
list = new ArrayList<Shark>();
for(int k = 1; k <= R; k++ ) {
for(int l = 1; l <= C; l++) {
if(map[k][l] != null) {
list.add(map[k][l]);
}
}
}
}
System.out.println(sum);
}
static int R;
static int C;
static List<Shark> moveList;
static void moveShark(Shark shark, int speed) {
if(speed <= 0) {
moveList.add(shark);
return;
}
if(shark.d == 1) {
while(true) {
if(speed <= 0)break;
if(shark.r == 1) {
shark.d = 2;
break;
}
shark.r--;
speed--;
}
}else if(shark.d == 2) {
while(true) {
if(speed <= 0)break;
if(shark.r == R) {
shark.d = 1;
break;
}
shark.r++;
speed--;
}
}else if(shark.d == 3) {
while(true) {
if(speed <= 0)break;
if(shark.c == C) {
shark.d = 4;
break;
}
shark.c++;
speed--;
}
}else if(shark.d == 4) {
while(true) {
if(speed <= 0)break;
if(shark.c == 1) {
shark.d = 3;
break;
}
shark.c--;
speed--;
}
}
moveShark(shark, speed);
}
}
class Shark{
int r; //y
int c; //x
int s; //speed
int d; //dir
int z; //size
public Shark() {}
public Shark(int r, int c, int s, int d, int z) {
super();
this.r = r;
this.c = c;
this.s = s;
this.d = d;
this.z = z;
}
}