[구름톤 챌린지] 중첩 점 (JS)

hhkim·2023년 9월 6일
0

Algorithm - JavaScript

목록 보기
125/188
post-thumbnail

풀이 과정

  • 각 칸에 가로와 세로 줄이 모두 있을 때 가로 줄 수 * 세로 줄 수만큼 교점이 생김
  1. 정사각형 2차원 배열 생성
    이때 각 칸들은 가로, 세로 값을 0으로 하는 객체로 초기화
  2. 각 반직선에 대해 반복
  3. 시작 칸과 방향에 따라 1번 배열의 해당 행 또는 열에 가로 또는 세로 줄 수 추가
    R이면 해당 행에서 현재 열보다 같거나 큰 칸들에 가로줄 추가
    D이면 해당 열에서 현재 행보다 같거나 큰 칸들에 세로줄 추가
  4. 1번 배열에 대해 반복하면서 교점 수 더하기

코드

const readline = require('readline');
let rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];
let N, M;
const DIR = {
  U: { y: -1, x: 0, l: 'v' },
  D: { y: 1, x: 0, l: 'v' },
  L: { y: 0, x: -1, l: 'h' },
  R: { y: 0, x: 1, l: 'h' },
};

rl.on('line', (line) => {
  input.push(line.split(' '));
  [N, M] = input[0].map(Number);
  if (input.length === M + 1) {
    rl.close();
  }
});

rl.on('close', () => {
  const arr = Array(N)
    .fill(0)
    .map((_) =>
      Array(N)
        .fill([])
        .map((_) => ({ h: 0, v: 0 }))
    );
  for (let i = 1; i <= M; ++i) {
    let [y, x, d] = input[i];
    [y, x] = [y, x].map((n) => Number(n) - 1);
    const dir = DIR[d];
    while (y >= 0 && y < N && x >= 0 && x < N) {
      arr[y][x][dir.l] += 1;
      y += dir.y;
      x += dir.x;
    }
  }

  let result = 0;
  for (let i = 0; i < N; ++i) {
    for (let j = 0; j < N; ++j) {
      result += arr[i][j].h * arr[i][j].v;
    }
  }

  console.log(result);
  process.exit();
});

🦾

와 오늘은 40분도 안 걸려서 풀었다..!
아직 여기에 적용되는 알고리즘이 뭐고 이런 건 잘 모르겠지만..ㅎ
2차원 배열에 추가로 또 여러 개의 데이터를 저장해야 해서 그 부분이 복잡해지니까 고민이 많았는데, 결국 객체를 만들어서 해결했다. 코드가 이상해서 맘에 쏙 들지는 않는다.

0개의 댓글