λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🧠 μ•Œκ³ λ¦¬μ¦˜

[λ°±μ€€] λ„λ‘œμ˜ 개수 1577 JS

by megan07 2024. 1. 29.

 

문제 ν•΄κ²° 방식

μš°μ„  N,M의 λ²”μœ„κ°€ 100μ΄ν•˜μ—¬μ„œ n^2으둜 ν’€μ—ˆμŠ΅λ‹ˆλ‹€.

DP문제라고 νŒλ‹¨ν•˜μ—¬ ν…Œμ΄λΈ”λ‘œ 값을 κ°±μ‹ ν•˜λ©΄μ„œ ν’€μ—ˆμŠ΅λ‹ˆλ‹€

(0,0)μ—μ„œ μ‹œμž‘ν•΄μ„œ (N,M)κΉŒμ§€ κ°€λŠ” μ΅œλ‹¨κ±°λ¦¬μ΄κΈ° λ•Œλ¬Έμ—

μš°μƒλ‹¨μ„ ν–₯ν•΄ κ°€λŠ” κ°’λ“€λ§Œ κ³ λ €ν–ˆμŠ΅λ‹ˆλ‹€.

DP[i][j] = DP[i][j-1] + DP[i-1][j];

κ·Έμ€‘μ—μ„œ 곡사 쀑인 길은 μ œμ™Έν•˜κ³  값을 λ”ν•΄λ‚˜κ°”μŠ΅λ‹ˆλ‹€.

 

둜직 μƒμ—λŠ” λ¬Έμ œκ°€ μ—†λŠ” 것 κ°™μ•˜λŠ”λ° μ œμΆœμ„ ν•˜μžλ§ˆμž λ‹€ ν‹€λ¦¬λ”λΌκ΅¬μš”

μ•Œκ³ λ³΄λ‹ˆ 경둜λ₯Ό set에 μ €μž₯ν•  λ•Œ ν‚€κ°’μ˜ λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€

μ²˜μŒμ—λŠ” ${a}${b}${c}${d} 이런 μ‹μœΌλ‘œ 킀값을 μ€¬μ—ˆλŠ”λ°

κ΅¬λΆ„μž 없이 킀값을 μ£Όλ‹ˆ a,b,c,d값이 닀름에도 같은 κ°’μœΌλ‘œ μΈμ‹λ˜μ–΄μ„œ ν‹€λ¦° 것 κ°™μ•„μš”

 

const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';

const [size, k, ...k_List] = require('fs')
  .readFileSync(filePath)
  .toString()
  .trim()
  .split('\n');

const [N, M] = size.split(' ').map(Number);
function solution(N, M, K_List) {
  const DP = Array.from(new Array(N + 1), () => new Array(M + 1).fill(0n));
  DP[0][0] = 1n;

  const dr = [0, 1];
  const dc = [1, 0];

  const construction = new Set();
  K_List.forEach(([a, b, c, d]) => {
    if (a < c || b < d) construction.add(`${a},${b},${c},${d}`);
    else construction.add(`${c},${d},${a},${b}`);
  });

  for (let i = 0; i <= N; i++) {
    for (let j = 0; j <= M; j++) {
      for (let k = 0; k < 2; k++) {
        const prevR = i - dr[k];
        const prevC = j - dc[k];
        if (prevR >= 0 && prevC >= 0) {
          if (!construction.has(`${prevR},${prevC},${i},${j}`)) {
            DP[i][j] += DP[prevR][prevC];
          }
        }
      }
    }
  }

  return DP[N][M].toString();
}

const answer = solution(
  N,
  M,
  k_List.map((k) => k.split(' ').map(Number)),
);

console.log(answer);