# 유형 : 시뮬레이션

# 난이도 : 골드 3

# 다른 분들 코드 보니까 상어 클래스에 Comparable 구현해서 정렬도 하고 그러던데, 시뮬레이션은 각자 풀기 나름인듯 싶다. 시뮬레이션 풀 때마다 시간, 메모리 너무 과다하게 잡아먹어서 효율적으로 짜는 것도 연습해야겠다. 코드 설명은 주석을 달아 놓았음.

 

코드 순서

1. 낚시꾼을 오른쪽으로 한칸 이동(시작점은 0)

2. 이동한 지점을 기준으로 가장 가까운 상어를 찾는다. 

3. 상어를 큐에 넣고 조건에 맞게 이동시켜주고, 만약 상어가 이미 있다면 크기 비교 후 큰 상어만 남긴다.

> 2~3번 작업을 낚시꾼이 오른쪽 끝범위까지 갈때까지 반복한다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package bj;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class p17143 {
    
    ///d가 1인 경우는 위, 2인 경우는 아래, 3인 경우는 오른쪽, 4인 경우는 왼쪽
    static int moveX[] = {0,0,0,1,-1};
    static int moveY[] = {0,-1,1,0,0};
    static int R ,C, M, result=0;
    static Shark[][] shark;
    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());
        shark = new Shark[R+1][C+1];
        for(int m=0; m<M; m++) {
            st = new StringTokenizer(br.readLine());
            int r = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            int s = Integer.parseInt(st.nextToken());
            int d = Integer.parseInt(st.nextToken());
            int z = Integer.parseInt(st.nextToken());
            shark[r][c] = new Shark(s,d,z);
        }
        // 맨 왼쪽에서 시작
        int currentIndex = 0;
        for(int col=0; col<C; col++) {
            //시작하자마자 이동
            currentIndex++;
            for(int r=1; r<=R; r++) {
                // 현재 인덱스에서 가장 가까운 상어를 찾아서 result에 더한 후, break
                if(shark[r][currentIndex] != null) {
                    result += shark[r][currentIndex].z;
                    shark[r][currentIndex] = null;
                    break;
                }
            }
            // 상어를 큐에 넣고 이동을 위해 배열을 초기화시킨다.
            Queue<SharkMove> queue = new LinkedList<>();
            for(int i=1; i<=R; i++
                for(int j=1; j<=C; j++
                    if(shark[i][j] != null
                        queue.add(new SharkMove(i, j, shark[i][j].s, shark[i][j].d, shark[i][j].z));
                
            
            shark = new Shark[R+1][C+1];
            
            while(!queue.isEmpty()) {
                SharkMove sm = queue.poll();
                for(int s=0; s<sm.s; s++) {
                    /////d가 1인 경우는 위, 2인 경우는 아래, 3인 경우는 오른쪽, 4인 경우는 왼쪽
                    if(sm.d == 1 || sm.d == 2) {
                        int newY = sm.r + moveY[sm.d];
                        // 벽을 만나면 1은 2로 2는 1로 방향이 바뀐다. 이것을 처리해주기 위함 
                        if(!(1<=newY && newY<=R))
                            sm.d = 3 - sm.d;
                        sm.r += moveY[sm.d];
                    }else {
                        int newX = sm.c + moveX[sm.d];
                        // 벽을 만나면 3은 4로 4는 3로 방향이 바뀐다.
                        if(!(1<=newX && newX<=C))
                            sm.d = 7 - sm.d;
                        sm.c += moveX[sm.d];
                    }
                }
                // 만약 해당 위치에 이미 상어가 있다면 크기 비교후 큰 상어만 남긴다. 
                if(shark[sm.r][sm.c] != null) {
                    if(sm.z > shark[sm.r][sm.c].z) {
                        shark[sm.r][sm.c] = new Shark(sm.s, sm.d, sm.z);
                    }
                }else {
                    shark[sm.r][sm.c] = new Shark(sm.s, sm.d, sm.z);
                }
            }
        }
        System.out.println(result);
    }
    public static class SharkMove{
        int r;
        int c;
        int s;
        int d;
        int z;
        public SharkMove(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;
        }
    }
    public static class Shark{
        int s;
        int d;
        int z;
        public Shark(int s, int d, int z) {
            this.s=s;
            this.d=d;
            this.z=z;
        }
    }
}
 
cs

+ Recent posts