[백준] 17143* 낚시왕 (골드 1)

AI·2025년 9월 16일

https://www.acmicpc.net/problem/17143

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

    static int R,C,M, sum;
    static Shark[][] map;
    static List<Shark> list = new ArrayList<>();
    // 상, 하 우, 좌

    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,1,-1};

    public static void main(String[] args) throws Exception {
        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 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());

            Shark shark = new Shark(r, c, s, d-1, z);
            list.add(shark);
            map[r][c] = shark;
        }

        // solve
        for (int i = 1; i <= C; i++) {
            catchShark(i);
            moveShark();
            killShark();
        }
        System.out.println(sum);
    }

    static class Shark{
        int r,c,s,d,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;
        }
    }

    static void catchShark(int col){
        for(int i=1;i<=R;i++){
            if(map[i][col] != null){
                sum += map[i][col].z;
                list.remove(map[i][col]);
                break;
            }
        }
    }
    static void moveShark(){
        for(Shark shark : list){
            int r = shark.r;
            int c = shark.c;
            int s = shark.s;
            int d = shark.d;

            switch(d){
                case 0:
                case 1:
                    s %= (R-1)*2;
                    for(int i=0;i<s;i++){
                        if(r==1) d=1; // 상->하
                        else if(r==R) d=0; // 하->상
                        r+=dy[d];
                    }
                    shark.r=r;
                    shark.d=d;
                    break;

                case 2:
                case 3:
                    s %= (C-1)*2;
                    for(int i=0;i<s;i++){
                        if(c==1) d=2; // 좌->우
                        else if(c==C) d=3; // 우->좌
                        c+=dx[d];
                    }
                    shark.c=c;
                    shark.d=d;
                    break;

            }
        }
    }
    static void killShark(){
        // map reset
        for(int i=1;i<=R;i++){
            for(int j=1;j<=C;j++){
                map[i][j]=null;
            }
        }

        int size = list.size();
        for(int i=size-1;i>=0;i--){
            Shark s = list.get(i);

            if(map[s.r][s.c] == null){
                map[s.r][s.c] = s;
            } else if (map[s.r][s.c].z < s.z) {
                list.remove(map[s.r][s.c]);
                map[s.r][s.c] = s;
            } else{
                list.remove(s);
            }
        }

    }
}

0개의 댓글