반응형
풀이
빡구현 문제
처음에
상어들을 2차원 리스트에 넣어줬습니다.
1~M까지 넣어주고 상어들을 넣어주고
map에는 상어들의 인덱스 값을 띄웠습니다 !!
서있는 y위치를 증가시키면서
첫째 find를 구현해서 땅과 가장 가까운 상어를 잡아 total에 더해주고, 해당 위치는 0으로 바꿔주었고
해당 인덱스 상어의 x값을 -1로 초기화 했습니다. 이유는
상어들을 이동시킬때 잡아먹힌 앤지 아닌지 판별하려고 했습니다.
둘째 상어들 이동단계에서
map을 우선 0으로 초기화 시키구
잡히지 않은 상어들을 이동시켰습니다.
조건에 따라 벽에 부딪힌다면, 반대쪽으로 가게 구현했습니다.
map이 0이라면 해당 상어 인덱스를 map에 넣어주고
0이 아니라면
해당 위치에 있는 상어 크기와 현재 상어 크기의 값을 비교해주었습니다.
import java.io.*;
import java.util.*;
public class Main {
static int R,C,m,cur_y, total;
static int[][] map;
// 위 아래 오른 왼
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,1,-1};
static int[][] shark;
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
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());
map = new int[R][C];
total = 0;
// r,c, 속력 , 방향,크기
shark = new int[m+1][5];
for(int i=1; i<=m ; i++) {
st= new StringTokenizer(br.readLine()," ");
int r = Integer.parseInt(st.nextToken())-1;
int c = Integer.parseInt(st.nextToken())-1;
int s = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken())-1;
int z = Integer.parseInt(st.nextToken());
shark[i][0] = r;
shark[i][1] = c;
shark[i][2] = s;
shark[i][3] = d;
shark[i][4] = z;
map[r][c] = i;
}
//낚시 시작
cur_y=-1;
while(true) {
// 오른쪽으로 이동
if(cur_y == C-1) break;
cur_y ++;
// 가까운 상어 잡기
find();
// 상어 이동
move();
}
System.out.println(total);
}
private static void move() {
// TODO Auto-generated method stub
map = new int[R][C];
for(int i = 1 ; i<=m ; i++) {
// 상어가 존재 한다
if(shark[i][0] != -1) {
int x = shark[i][0];
int y = shark[i][1];
int s = shark[i][2];
int d = shark[i][3];
int z = shark[i][4];
for(int j = 0 ; j < s ; j++) {
int nx = x + dx[d];
int ny = y + dy[d];
if(0>nx) {
nx = 1 ;
d=1;
}
else if(0>ny) {
ny = 1;
d=2;
}
else if(nx>R-1) {
nx = R-2;
d=0;
}
else if(ny>C-1) {
ny = C-2;
d=3;
}
x = nx;
y = ny;
}
shark[i][0]=x;
shark[i][1]=y;
shark[i][2]=s;
shark[i][3]=d;
shark[i][4]=z;
// 해당 맵에 상어가 있다
if(map[x][y] != 0) {
// 누가 더 큰지 따져준다
if(shark[map[x][y]][4] > z) {
shark[i][0] = -1;
}
else {
shark[map[x][y]][0] = -1;
map[x][y] = i;
}
}
//없다
else {
map[x][y] = i;
}
}
}
}
private static void find() {
// TODO Auto-generated method stub
for(int i = 0 ; i<R ; i++) {
if(map[i][cur_y] != 0) {
int shark_idx = map[i][cur_y];
map[i][cur_y] = 0;
total += shark[shark_idx][4];
shark[shark_idx][0] = -1;
break;
}
}
}
}
문제 자체는 어렵지 않지만,, 구현하다보면 헷갈릴 수도 있습니당
빡구현 문제는 변수랑 함수를 잘 나누어줘야 덜 헷갈리는거 같습니다. !
반응형
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[Java/자바 백준 14503] 로봇 청소기 (0) | 2022.01.03 |
---|---|
[Java/자바 백준 23288] 주사위굴리기2 (0) | 2021.11.16 |
[Java/자바 백준 16235] 나무 재테크 (0) | 2021.11.10 |
[Java/자바 백준 21610] 마법사 상어와 비바라기 (0) | 2021.11.10 |
[Java/자바 백준 16234] 인구이동 (0) | 2021.11.09 |