Loading...
본문 바로가기
👥
총 방문자
📖
0개 이상
총 포스팅
🧑
오늘 방문자 수
📅
0일째
블로그 운영

여러분의 방문을 환영해요! 🎉

다양한 개발 지식을 쉽고 재미있게 알려드리는 블로그가 될게요. 함께 성장해요! 😊

PS/백준

[백준][구현] 20057 마법사 상어와 토네이도 NodeJs 구현

by 꽁이꽁설꽁돌 2024. 10. 18.
728x90
반응형

목차

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

    문제

     

    문제 구현 방향

    퍼지는 것은 쉽게 구현했는데 모래 이동하는 것을 잘못 구해서 헤맸다..

     

     

    주요 로직

    방향 전환

    중간 부터 시작해서 제한을 두배씩 늘려가는 식으로 했다.

    또한 중간에 도달하면 방향을 바꾸어야 하고 끝에 도달해도 방향을 바꾸어야 한다.

    while (1) {
      if (x <= 0 && y <= 0) break;
      x += dx[dir];
      y += dy[dir];
      distribute(x, y, dir, board);
      board[y][x] = 0;
      dnt++;
      if (dnt == limit) {
        dir = (dir + 1) % 4;
      }
      if (dnt == limit * 2) {
        dnt = 0;
        limit++;
        dir = (dir + 1) % 4;
      }
    }

     

     

    코드 구현

    const input = require("fs")
      .readFileSync("./dev/stdin", "utf-8")
      .trim()
      .split("\n");
    
    let N = Number(input[0]);
    input.splice(0, 1);
    let board = Array.from(Array(N), () => Array(N));
    let dx = [-1, 0, 1, 0];
    let dy = [0, 1, 0, -1];
    for (let i = 0; i < N; i++) {
      let ar = input[i].trim().split(" ").map(Number);
      for (let j = 0; j < N; j++) {
        board[i][j] = ar[j];
      }
    }
    function checking(x, y) {
      if (x <= N - 1 && x >= 0 && y <= N - 1 && y >= 0) return true;
      else return false;
    }
    let ans = 0;
    function distribute(curx, cury, dir, board) {
      let relU = (dir + 3) % 4;
      let relD = (dir + 1) % 4;
      let relL = dir;
      let relR = (dir + 2) % 4;
      let curSize = board[cury][curx];
    
      let res7 = Math.floor((board[cury][curx] * 7) / 100);
      let res2 = Math.floor((board[cury][curx] * 2) / 100);
      let res10 = Math.floor((board[cury][curx] * 10) / 100);
      let res5 = Math.floor((board[cury][curx] * 5) / 100);
      let res1 = Math.floor((board[cury][curx] * 1) / 100);
      let resa = curSize - res7 * 2 - res2 * 2 - res1 * 2 - res10 * 2 - res5;
      let nx = curx + dx[relU];
      let ny = cury + dy[relU];
      if (checking(nx, ny)) {
        board[ny][nx] += res7;
      } else {
        ans += res7;
      }
      nx = curx + dx[relD];
      ny = cury + dy[relD];
      if (checking(nx, ny)) {
        board[ny][nx] += res7;
      } else {
        ans += res7;
      }
      nx = curx + dx[relU] * 2;
      ny = cury + dy[relU] * 2;
      if (checking(nx, ny)) {
        board[ny][nx] += res2;
      } else {
        ans += res2;
      }
      nx = curx + dx[relD] * 2;
      ny = cury + dy[relD] * 2;
      if (checking(nx, ny)) {
        board[ny][nx] += res2;
      } else {
        ans += res2;
      }
      nx = curx + dx[relU] + dx[relR];
      ny = cury + dy[relU] + dy[relR];
      if (checking(nx, ny)) {
        board[ny][nx] += res1;
      } else {
        ans += res1;
      }
      nx = curx + dx[relD] + dx[relR];
      ny = cury + dy[relD] + dy[relR];
      if (checking(nx, ny)) {
        board[ny][nx] += res1;
      } else {
        ans += res1;
      }
      nx = curx + dx[relU] + dx[relL];
      ny = cury + dy[relU] + dy[relL];
      if (checking(nx, ny)) {
        board[ny][nx] += res10;
      } else {
        ans += res10;
      }
      nx = curx + dx[relD] + dx[relL];
      ny = cury + dy[relD] + dy[relL];
      if (checking(nx, ny)) {
        board[ny][nx] += res10;
      } else {
        ans += res10;
      }
    
      nx = curx + dx[relL] * 2;
      ny = cury + dy[relL] * 2;
      if (checking(nx, ny)) {
        board[ny][nx] += res5;
      } else {
        ans += res5;
      }
      nx = curx + dx[relL];
      ny = cury + dy[relL];
      if (checking(nx, ny)) {
        board[ny][nx] += resa;
      } else {
        ans += resa;
      }
    }
    
    let x = Math.floor(N / 2);
    let y = Math.floor(N / 2);
    let limit = 1;
    let dnt = 0;
    let dir = 0;
    
    while (1) {
      if (x <= 0 && y <= 0) break;
      x += dx[dir];
      y += dy[dir];
      distribute(x, y, dir, board);
      board[y][x] = 0;
      dnt++;
      if (dnt == limit) {
        dir = (dir + 1) % 4;
      }
      if (dnt == limit * 2) {
        dnt = 0;
        limit++;
        dir = (dir + 1) % 4;
      }
    }
    
    console.log(ans);

     

    모래가 퍼지는 것은 무식하게 만들었다... 최적화할 수 있을텐데

    반응형