티스토리 뷰

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

 

17143번: 낚시왕

낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다.

www.acmicpc.net

구현 문제

 

const fs = require('fs');
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n").map(v => v.split(' ').map(Number));
const [R, C, S] = input.shift();
if (S == 0) {
  process.exit(console.log(0));
}

let shark = Array.from(Array(R), () => Array(C).fill(false));

const dir = [
  [0, -1],
  [0, 1],
  [1, 0],
  [-1, 0]
]

input.forEach(v => {
  const [r, c, s, d, z] = v;
  shark[r - 1][c - 1] = [s, d, z]
})




let answer = 0;
for (let i = 0; i < C; i++) {
  const king = i;
  //낚시
  for (let fishing = 0; fishing < R; fishing++) {
    if (shark[fishing][king]) {
      answer += shark[fishing][king][2];
      shark[fishing][king] = false;
      break;
    }
  }

  // 상어 이동,
  let nextShark = Array.from(Array(R), () => Array(C).fill(false));
  for (let r = 0; r < R; r++) {
    for (let c = 0; c < C; c++) {
      if (shark[r][c]) {
        const [s, d, z] = shark[r][c];
        let rest = s;
        let location = { r, c };
        let direction = d;
        while (rest > 0) {
          switch (direction) {
            case 1: //위
              if (location.r - rest >= 0) {
                location.r -= rest
                rest = 0;
              } else {
                rest -= location.r;
                location.r = 0;
                direction = 2;
              }
              break;
            case 2://아래
              if (location.r + rest < R) {
                location.r += rest
                rest = 0;
              } else {
                rest -= (R - location.r - 1);
                location.r = R - 1;
                direction = 1;
              }
              break;
            case 3:// 오른쪽
              if (location.c + rest < C) {
                location.c += rest
                rest = 0;
              } else {
                rest -= (C - location.c - 1);
                location.c = C - 1;
                direction = 4;
              }
              break;
            case 4://왼쪽
              if (location.c - rest >= 0) {
                location.c -= rest
                rest = 0;
              } else {
                rest -= location.c;
                location.c = 0;
                direction = 3;
              }
              break;
          }
        }
        if (!nextShark[location.r][location.c] || (nextShark[location.r][location.c][2] < z)) {
          nextShark[location.r][location.c] = [s, direction, z];
        }
      }
    }
  }

  shark = nextShark;
}

console.log(answer)
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
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
글 보관함