Dev.baelanche

[백준 17143] 낚시왕 본문

Data Structure & Algorithm/PS - JAVA

[백준 17143] 낚시왕

baelanche 2019. 6. 24. 21:20
반응형

 

문제에서 요구한대로 해결해야하는 시뮬레이션 문제이다.

 

낚시 -> 상어의 이동 을 반복하며 잡은 상어의 크기를 누적해서 더한다.

두마리 이상의 상어가 같은 위치에 머물게 되면 가장 큰 상어만 남게되는 부분만 유의하면 된다.

 

public class Main {
    
    static int R;
    static int C;
    static int m;
    static Shark a[][];
    static ArrayList<Shark> list = new ArrayList<Shark>();
    static int sum = 0;
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        st = new StringTokenizer(br.readLine());
        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        a = new Shark[R+1][C+1];
        
        for(int i=0; i<m; i++) {
            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());
            a[r][c] = new Shark(s, d, z);
        }
        
        dfs(0);
        System.out.println(sum);
    }
    
    public static void dfs(int human) {
        human++;
        if(human > C) return;
        
        for(int i=0; i<=R; i++) {
            if(a[i][human] != null) {
                sum += a[i][human].z;
                a[i][human] = null;
                break;
            }
        }
        
        for(int i=0; i<=R; i++) {
            for(int j=0; j<=C; j++) {
                if(a[i][j] != null)
                    moveShark(i, j, a[i][j]);
            }
        }
        setShark();
        dfs(human);
    }
    
    public static void moveShark(int r, int c, Shark s) {
        if(s.d == 1 || s.d == 2) {
            boolean up;
            if(s.d == 1) up = true;
            else up = false;
            
            int pos = r;
            for(int i=0; i<s.s; i++) {
                if(up) pos -= 1;
                else pos += 1;
                if(pos == 0) {
                    up = false;
                    pos = 2;
                }
                else if(pos == R+1) {
                    up = true;
                    pos = R-1;
                }
            }
            int d = 0;
            if(up) d = 1;
            else d = 2;
            list.add(new Shark(pos, c, s.s, d, s.z));
        }
        
        if(s.d == 3 || s.d == 4) {
            boolean right;
            if(s.d == 3) right = true;
            else right = false;
            
            int pos = c;
            for(int i=0; i<s.s; i++) {
                if(right) pos += 1;
                else pos -= 1;
                if(pos == C+1) {
                    right = false;
                    pos = C-1;
                }
                else if(pos == 0) {
                    right = true;
                    pos = 2;
                }
            }
            int d = 0;
            if(right) d = 3;
            else d = 4;
            list.add(new Shark(r, pos, s.s, d, s.z));
        }
    }
    
    public static void setShark() {
        for(int i=1; i<=R; i++)
            for(int j=1; j<=C; j++)
                a[i][j] = null;
        
        if(list.size() == 0) return;
        for(int i=0; i<list.size(); i++) {
            int r = list.get(i).r;
            int c = list.get(i).c;
            int s = list.get(i).s;
            int d = list.get(i).d;
            int z = list.get(i).z;
            if(a[r][c] == null)
                a[r][c] = new Shark(s, d, z);
            else {
                if(a[r][c].z < z)
                    a[r][c] = new Shark(s, d, z);
            }
        }
        list.clear();
    }
    
    static class Shark {
        int r;
        int c;
        int s;
        int d;
        int z;
        
        Shark(int s, int d, int z) {
            this.s = s;
            this.d = d;
            this.z = z;
        }
        
        Shark(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;
        }
    }
}
반응형

'Data Structure & Algorithm > PS - JAVA' 카테고리의 다른 글

[백준 16235] 나무 재테크  (0) 2019.06.24
[백준 13458] 시험 감독  (0) 2019.06.24
[백준 9506] 약수들의 합  (0) 2019.06.20
[백준 17144] 미세먼지 안녕!  (0) 2019.06.20
[백준 16234] 인구 이동  (0) 2019.06.20
Comments