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

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

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

백준 문제풀이/Nodejs

[백준][구현] 20056 마법사 상어와 파이어볼 NodeJs 구현

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

목차

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

    문제

     

    문제 구현시 주의점

    격자의 행과 열은 1번부터 N번까지 번호가 매겨져 있고, 1번 행은 N번과 연결되어 있고, 1번 열은 N번과 연결되어 있다는 조건에서 좌표가 순환한다는 것을 캐치해야 한다. 

     

     

    문제 구현 아이디어

    좌표 순환에 대한 해결 방법

    아래와 같이 패턴을 찾아 한번에 계산하도록 하였다.

    function convertpos(pos) {
      if (pos <= N && pos >= 0) {
        if (pos === 0) return N;
        return pos;
      } else if (pos > N) {
        if (pos % N === 0) return N;
        return pos % N;
      } else if (pos < 0) {
        return N + (pos % N);
      }
    }

     

    좌표 홀짝에 관한 방향성 정하기

    function checking(arr) {
      let flag;
      for (let i = 0; i < arr.length; i++) {
        if (i == 0) {
          flag = arr[i] % 2;
          continue;
        }
        if (flag != arr[i] % 2) {
          return 0;
        }
      }
      return 1;
    }

     

    NodeJs로 배열 해쉬테이블 만들기

    let firemap = new Map();
    function addValueToMap(key, value) {
      if (!firemap.has(key)) {
        firemap.set(key, []);
      }
      firemap.get(key).push(value);
    }

     

    Js구현 시 주의점

    c++과 같은 기능의 나눗셈을 해줄려면 trunc를 써주어야 한다.

       sumM = Math.trunc((sumM /= 5));
       sumS = Math.trunc(sumS / arr.length);

     

    해쉬맵의 키 값은 이런식으로 값으로 해야한다.

    객체는 다른 참조이기 때문에 중복 해쉬검사가 제대로 작동하지 않는다.

        addValueToMap(`${sx}_${sy}`, fireballs[j]);

    코드 구현

    const input = require("fs")
      .readFileSync("./dev/stdin", "utf-8")
      .trim()
      .split("\n");
    
    let fireballs = [];
    let [N, M, K] = input[0].split(" ").map(Number);
    input.splice(0, 1);
    for (let i = 0; i < M; i++) {
      let k = input[i].split(" ").map(Number);
      fireballs.push({ r: k[0], c: k[1], m: k[2], s: k[3], d: k[4] });
    }
    
    let dx = [0, 1, 1, 1, 0, -1, -1, -1];
    let dy = [-1, -1, 0, 1, 1, 1, 0, -1];
    //1~N
    
    let firemap = new Map();
    function addValueToMap(key, value) {
      if (!firemap.has(key)) {
        firemap.set(key, []);
      }
      firemap.get(key).push(value);
    }
    
    function checking(arr) {
      let flag;
      for (let i = 0; i < arr.length; i++) {
        if (i == 0) {
          flag = arr[i] % 2;
          continue;
        }
        if (flag != arr[i] % 2) {
          return 0;
        }
      }
      return 1;
    }
    
    function convertpos(pos) {
      if (pos <= N && pos >= 0) {
        if (pos === 0) return N;
        return pos;
      } else if (pos > N) {
        if (pos % N === 0) return N;
        return pos % N;
      } else if (pos < 0) {
        return N + (pos % N);
      }
    }
    
    for (let i = 0; i < K; i++) {
      for (let j = 0; j < fireballs.length; j++) {
        let direc = fireballs[j].d;
        let ds = fireballs[j].s;
        let sx = fireballs[j].c + ds * dx[direc];
        let sy = fireballs[j].r + ds * dy[direc];
        sx = convertpos(sx);
        sy = convertpos(sy);
        fireballs[j].c = sx;
        fireballs[j].r = sy;
        addValueToMap(`${sx}_${sy}`, fireballs[j]);
      }
    
      fireballs = [];
      for (let key of firemap) {
        let arr = firemap.get(key);
        let sumM = 0;
        let sumS = 0;
        if (arr.length >= 2) {
          let direcs = [];
          for (let i = 0; i < arr.length; i++) {
            sumS += arr[i].s;
            sumM += arr[i].m;
            direcs.push(arr[i].d);
          }
          sumM = Math.trunc((sumM /= 5));
          sumS = Math.trunc(sumS / arr.length);
          if (sumM === 0) {
            continue;
          }
          if (checking(direcs)) {
            for (let i = 0; i <= 6; i += 2) {
              fireballs.push({ r: arr[0].r, c: arr[0].c, m: sumM, s: sumS, d: i });
            }
          } else {
            for (let i = 1; i <= 7; i += 2) {
              fireballs.push({ r: arr[0].r, c: arr[0].c, m: sumM, s: sumS, d: i });
            }
          }
        } else {
          fireballs.push(...arr);
        }
      }
      firemap.clear();
    }
    
    let ans = 0;
    for (let i = 0; i < fireballs.length; i++) {
      ans += fireballs[i].m;
    }
    console.log(ans);

     

    반응형