๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm] ๊ณต ์ด๋™ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

๐Ÿ“‹ ๋ฌธ์ œ

nํ–‰ m์—ด์˜ ๊ฒฉ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฉ์ž์˜ ๊ฐ ํ–‰์€ 0, 1, ..., n-1๋ฒˆ์˜ ๋ฒˆํ˜ธ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ ์—ด์€ 0, 1, ..., m-1๋ฒˆ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋งค๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด ๊ฒฉ์ž์— ๊ณต์„ ํ•˜๋‚˜ ๋‘๊ณ , ๊ทธ ๊ณต์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋“ค์„ ๋‚ ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

  • ์—ด ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ dx์นธ ์ด๋™ํ•˜๋Š” ์ฟผ๋ฆฌ (query(0, dx))
  • ์—ด ๋ฒˆํ˜ธ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ dx์นธ ์ด๋™ํ•˜๋Š” ์ฟผ๋ฆฌ (query(1, dx))
  • ํ–‰ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ dx์นธ ์ด๋™ํ•˜๋Š” ์ฟผ๋ฆฌ (query(2, dx))
  • ํ–‰ ๋ฒˆํ˜ธ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ dx์นธ ์ด๋™ํ•˜๋Š” ์ฟผ๋ฆฌ (query(3, dx))

๋‹จ, ๊ณต์€ ๊ฒฉ์ž ๋ฐ”๊นฅ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ชฉ์ ์ง€๊ฐ€ ๊ฒฉ์ž ๋ฐ”๊นฅ์ธ ๊ฒฝ์šฐ ๊ณต์€ ์ด๋™ํ•˜๋‹ค๊ฐ€ ๋” ์ด์ƒ ์ด๋™ํ•  ์ˆ˜ ์—†์„ ๋•Œ ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 5ํ–‰ × 4์—ด ํฌ๊ธฐ์˜ ๊ฒฉ์ž ๋‚ด์˜ ๊ณต์ด 3ํ–‰ 2์—ด์— ์žˆ์„ ๋•Œ query(3, 10) ์ฟผ๋ฆฌ๋ฅผ ๋ฐ›์€ ๊ฒฝ์šฐ ๊ณต์€ 4ํ–‰ 2์—ด์—์„œ ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๊ฒฉ์ž์˜ ํฌ๊ธฐ๊ฐ€ 5ํ–‰ × 4์—ด์ด๋ฏ€๋กœ, 0~4๋ฒˆ ํ–‰๊ณผ 0~3๋ฒˆ ์—ด๋กœ ๊ฒฉ์ž๊ฐ€ ๊ตฌ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

๊ฒฉ์ž์˜ ํ–‰์˜ ๊ฐœ์ˆ˜ n, ์—ด์˜ ๊ฐœ์ˆ˜ m, ์ •์ˆ˜ x์™€ y, ๊ทธ๋ฆฌ๊ณ  ์ฟผ๋ฆฌ๋“ค์˜ ๋ชฉ๋ก์„ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด queries๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. n × m๊ฐœ์˜ ๊ฐ€๋Šฅํ•œ ์‹œ์ž‘์ ์— ๋Œ€ํ•ด์„œ ํ•ด๋‹น ์‹œ์ž‘์ ์— ๊ณต์„ ๋‘๊ณ  queries ๋‚ด์˜ ์ฟผ๋ฆฌ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ–ˆ์„ ๋•Œ, xํ–‰ y์—ด์— ๋„์ฐฉํ•˜๋Š” ์‹œ์ž‘์ ์˜ ๊ฐœ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • 1 ≤ n ≤ 10^9
  • 1 ≤ m ≤ 10^9
  • 0 ≤ x < n
  • 0 ≤ y < m
  • 1 ≤ queries์˜ ํ–‰์˜ ๊ฐœ์ˆ˜ ≤ 200,000
    • queries์˜ ๊ฐ ํ–‰์€ [command,dx] ๋‘ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
    • 0 ≤ command ≤ 3
    • 1 ≤ dx ≤ 109
    • ์ด๋Š” query(command, dx)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

2 2 0 0 [[2,1],[0,1],[1,1],[0,1],[2,1]]  4
2 5 0 1 [[3,1],[2,2],[1,1],[2,3],[0,1],[2,1]] 2

 

โœ๏ธ ํ’€์ด

๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐ˜๋Œ€๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

๋งŒ์•ฝ ←(1๋ฒˆ์งธ) ↓(2๋ฒˆ์งธ) ↓(3๋ฒˆ์งธ) →(4๋ฒˆ์งธ)์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค๋ฉด ์œ„์น˜ํ•ด์•ผ ํ•˜๋Š” ์ง€์ ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋ฐ˜๋Œ€๋กœ →(4๋ฒˆ์งธ) ↓(3๋ฒˆ์งธ) ↓(2๋ฒˆ์งธ) ←(1๋ฒˆ์งธ)๋กœ ์—ญ์ˆœ์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. ๋˜ํ•œ ๋ฐฉํ–ฅ๋„ ๋ฐ˜๋Œ€๊ฐ€ ๋˜์–ด ์ตœ์ข…์ ์œผ๋กœ ←(4๋ฒˆ์งธ) ↑(3๋ฒˆ์งธ) ↑(2๋ฒˆ์งธ) →(1๋ฒˆ์งธ)๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ ์€ ๋ฒฝ์— ๊ณต์ด ์œ„์น˜ํ•ด ์žˆ๋‹ค๋ฉด ๋ฒ”์œ„๋กœ ๊ณ„์‚ฐ์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

๋งŒ์•ฝ ๊ณต์ด ์œ„ ์ด๋ฏธ์ง€์˜ ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๊ณ  ํ˜„์žฌ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‘์นธ ๊ฐ€๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์— ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‘ ์œ„์น˜ ๋ชจ๋‘ ์™ผ์ชฝ์œผ๋กœ ๋‘์นธ ์ด๋™ํ–ˆ์„ ๋•Œ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—ญ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ minX, maxX, minY, maxY๋ผ๋Š” 4๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ๋‹ค. ๊ฐ๊ฐ ๋ฒ”์œ„์˜ ์ƒ๋‹จ, ํ•˜๋‹จ, ์ขŒ์ธก, ์šฐ์ธก์„ ๊ฐ€๋ฅดํ‚จ๋‹ค. ๋‹ค์Œ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ๋” ์‰ฝ๋‹ค.

๋ฒ”์œ„๊ฐ€ ๋ ๋•Œ๋Š” ์กฐ๊ฑด์ด ์žˆ๋Š”๋ฐ ๊ธฐ์กด ์ฟผ๋ฆฌ์˜ ๋ฐฉํ–ฅ๊ณผ ํ•ด๋‹น ๋ฐฉํ–ฅ์˜ ๋ฒฝ์ด ๋ฐ”๋กœ ์˜†์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ์กฐ๊ฑด์ผ๋•Œ ์ขŒํ‘œ๋ฅผ (์ƒ๋‹จ ํ•˜๋‹จ), (์ขŒ์ธก ์šฐ์ธก) ๋‘˜๋‹ค ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ•˜๋‚˜๋งŒ ์ˆ˜์ •ํ•˜์—ฌ ๋ฒ”์œ„๋กœ ๊ตฌ์„ฑ๋˜๋„๋ก ํ•œ๋‹ค. 

 

ํ•œ๊ฐ€์ง€ ๋” ์ฃผ์˜ํ•  ์ ์ด ์žˆ๋Š”๋ฐ ๋งŒ์•ฝ ๋ฐ˜๋Œ€๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ ์‚ฌ๊ฐํ˜• ๋ฒ”์œ„๋ฅผ ์•„์— ๋ฒ—์–ด๋‚˜๋Š” ์ƒํ™ฉ์ด๋‹ค. ํ˜„์žฌ ๋ฒ”์œ„๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„๋•Œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž

์ด๋•Œ ๋งŒ์•ฝ ์ขŒ์ธก์œผ๋กœ 3ํšŒ ๊ฐ€๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

ํŒŒ๋ž€์ƒ‰ ํ…Œ๋‘๋ฆฌ๊ฐ€ ์•„์— ๊ฒฉ์ž ๋ฐ–์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค. ๋งŒ์•ฝ ์ผ๋ถ€๋งŒ ๋„˜์–ด๊ฐ„ ๊ฒฝ์šฐ ํ‘œ ๋‚ด๋ถ€์— ์žˆ๋Š” ๋ถ€๋ถ„์€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์— ๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ์—†๋‹ค๋Š” ์˜๋ฏธ๋กœ 0์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค. ๊ฐ ์ตœ๋Œ€๊ฐ’์ด 0 ๋ฏธ๋งŒ์ด ๋˜๊ฑฐ๋‚˜, ์ตœ์†Œ๊ฐ’์ด ๊ฒฉ์ž์˜ ํฌ๊ธฐ(n, m)์ด์ƒ์ด ๋  ๋•Œ๋กœ ํŒ๋‹จํ–ˆ๋‹ค.

 

๋ชจ๋“  ์ฟผ๋ฆฌ๋ฅผ ๋ฐ˜๋Œ€๋กœ ์ˆœํšŒํ•˜๊ณ  ๊ตฌํ•œ minX, maxX, minY, maxY๋Š” ๋ณ€์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๋„“์ด๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.

(maxX - minX + 1) * (maxY - minY + 1)

 

๋˜ ํ•œ๊ฐ€์ง€ ๋‚ด ๋ฐœ๋ชฉ์„ ์žก์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๊ฑด ๋ฐ”๋กœ BigInt์˜€๋‹ค. n๊ณผ m์˜ ๋ฒ”์œ„๊ฐ€ 10^9๋กœ ๊ณ„์‚ฐํ•  ๋•Œ ํ‘œํ˜„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— BigInt ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

โŒจ๏ธ ์ฝ”๋“œ

function solution(n, m, x, y, queries) {
  var answer = -1;

  let minX = BigInt(x),
    maxX = BigInt(x),
    minY = BigInt(y),
    maxY = BigInt(y);

  queries.reverse();
  for (const query of queries) {
    let [dist, cnt] = query;
    cnt = BigInt(cnt);

    if (dist === 0) {
      if (minY !== 0n) minY = minY + cnt;
      maxY = maxY + cnt;
    } else if (dist === 1) {
      if (maxY !== BigInt(m - 1)) maxY = maxY - cnt;
      minY = minY - cnt;
    } else if (dist === 2) {
      if (minX !== 0n) minX = minX + cnt;
      maxX = maxX + cnt;
    } else if (dist === 3) {
      if (maxX !== BigInt(n - 1)) maxX = maxX - cnt;
      minX = minX - cnt;
    }

    if (maxX < 0 || maxY < 0 || minX >= n || minY >= m) return 0;
    minX = minX < 0n ? 0n : minX;
    maxX = maxX >= BigInt(n) ? BigInt(n - 1) : maxX;
    minY = minY < 0n ? 0n : minY;
    maxY = maxY >= BigInt(m) ? BigInt(m - 1) : maxY;
  }

  answer = (maxX - minX + 1n) * (maxY - minY + 1n);

  return answer;
}