Notice
Recent Posts
Recent Comments
Link
ยซ   2024/09   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

Lennon FE

[๋ฐฑ์ค€ 17144๋ฒˆ] ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•! - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(nodejs) ๋ณธ๋ฌธ

๐Ÿ”ฅ Algorithm/Baekjoon

[๋ฐฑ์ค€ 17144๋ฒˆ] ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•! - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(nodejs)

Lennon 2022. 3. 16. 05:19
728x90
๋ฐ˜์‘ํ˜•

ใ…Žhttps://www.acmicpc.net/problem/17144

 

17144๋ฒˆ: ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!

๋ฏธ์„ธ๋จผ์ง€๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์‚ฌ๊ณผ๋Š” ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์‚ฌ๊ณผ๋Š” ์ง‘์„ ํฌ๊ธฐ๊ฐ€ R×C์ธ ๊ฒฉ์žํŒ์œผ๋กœ ๋‚˜ํƒ€๋ƒˆ๊ณ , 1×1 ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆด๋‹ค. ๊ตฌ์‚ฌ

www.acmicpc.net

์ด๋ฒˆ ๊ตฌํ˜„๋ฌธ์ œ๋Š” ๋นก๊ตฌํ˜„ ๋ฌธ์ œ ์ˆ˜์ค€์ด๋ผ ์ฝ”๋“œ๊ฐ€ ์ •๋ง ๊ธธ๋‹ค... ๋” ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ‘ธ๋Š๋ผ ์ง€์ณ๋ฒ„๋ ธ๋‹ค.

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
let input = [];
rl.on('line', function (line) {
  input.push(line);
  if (input.length === +input[0].split(' ')[0] + 1) {
    rl.close();
  }
}).on('close', function () {
  let [R, C, time] = input.shift().split(' ').map(Number);
  let house = input.map((v) => v.split(' ').map(Number));
  const airCleanerIdx = house.map((v) => v[0]).indexOf(-1);

  let answer = 0;

  while (time) {
    house = diffusionDust(house); // ๋ฏธ์„ธ๋จผ์ง€ ํ™•์žฅ

    const antiClockwise = antiClockwiseRotation(house, airCleanerIdx); // ๋ฐ˜์‹œ๊ณ„ ํšŒ์ „
    const clockwise = clockwiseRotation(house, airCleanerIdx); // ์‹œ๊ณ„ ํšŒ์ „

    house = antiClockwise.concat(clockwise); // ๋ฐ˜์‹œ๊ณ„ + ์‹œ๊ณ„ ๋ฐฐ์—ด ํ•ฉ์น˜๊ธฐ

    answer = house.reduce((acc, cur) => acc + cur.reduce((a, c) => a + c), 0) + 2;

    time--;
  }

  console.log(answer);
});

function diffusionDust(arr) {
  const list = [];

  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[i].length; j++) {
      if (arr[i][j] === 0 || arr[i][j] === -1) continue;

      const value = Math.floor(arr[i][j] / 5);
      let cnt = 0;

      if (i < arr.length - 1 && arr[i + 1][j] !== -1) {
        list.push([i + 1, j, value]);
        cnt++;
      }
      if (i > 0 && arr[i - 1][j] !== -1) {
        list.push([i - 1, j, value]);
        cnt++;
      }
      if (j < arr[i].length - 1 && arr[i][j + 1] !== -1) {
        list.push([i, j + 1, value]);
        cnt++;
      }
      if (j > 0 && arr[i][j - 1] !== -1) {
        list.push([i, j - 1, value]);
        cnt++;
      }

      arr[i][j] -= value * cnt;
    }
  }

  list.forEach((v) => {
    const [i, j, value] = v;

    arr[i][j] += value;
  });

  return arr;
}

function clockwiseRotation(arr, idx) {
  const clockwiseArr = [];

  for (let i = 0; i < arr.length; i++) {
    if (i > idx) {
      clockwiseArr.push(arr[i]);
    }
  }
  const value = [];

  value.push(...clockwiseArr[0].slice(1));
  for (let i = 1; i < clockwiseArr.length - 1; i++) value.push(clockwiseArr[i][clockwiseArr[1].length - 1]);
  value.push(...clockwiseArr[clockwiseArr.length - 1].reverse());
  clockwiseArr[clockwiseArr.length - 1].reverse();
  for (let i = clockwiseArr.length - 2; i > 0; i--) value.push(clockwiseArr[i][0]);

  value.pop();
  let x = 1;
  let y = 0;

  while (x < clockwiseArr[1].length - 1) {
    clockwiseArr[y][++x] = value.shift();
  }
  while (y < clockwiseArr.length - 1) {
    clockwiseArr[++y][x] = value.shift();
  }
  while (x > 0) {
    clockwiseArr[y][--x] = value.shift();
  }
  while (y > 0) {
    clockwiseArr[--y][x] = value.shift();
  }
  clockwiseArr[0][0] = -1;
  clockwiseArr[0][1] = 0;

  return clockwiseArr;
}

function antiClockwiseRotation(arr, idx) {
  const antiClockwiseArr = [];

  for (let i = 0; i < arr.length; i++) {
    if (i <= idx) {
      antiClockwiseArr.push(arr[i]);
    } else break;
  }

  const value = [];

  value.push(...antiClockwiseArr[idx].slice(1));
  for (let i = idx - 1; i > 0; i--) value.push(antiClockwiseArr[i][antiClockwiseArr[i].length - 1]);
  value.push(...antiClockwiseArr[0].reverse());
  antiClockwiseArr[0].reverse();
  for (let i = 1; i < idx; i++) value.push(antiClockwiseArr[i][0]);

  value.pop();
  let x = 1;
  let y = idx;

  while (x < antiClockwiseArr[1].length - 1) {
    antiClockwiseArr[y][++x] = value.shift();
  }
  while (y > 0) {
    antiClockwiseArr[--y][x] = value.shift();
  }
  while (x > 0) {
    antiClockwiseArr[y][--x] = value.shift();
  }
  while (y < idx) {
    antiClockwiseArr[++y][x] = value.shift();
  }

  antiClockwiseArr[idx][1] = 0;
  antiClockwiseArr[idx][0] = -1;

  return antiClockwiseArr;
}

diffusionDust ํ•จ์ˆ˜

- ๋ฏธ์„ธ๋จผ์ง€๋ฅผ ํ™•์žฅ์‹œํ‚ค๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ ๊ฐ๊ฐ ์ˆœ์„œ๋Œ€๋กœ ์ƒํ•˜์ขŒ์šฐ ํŒ๋ณ„ ํ•ด์ฃผ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, 0์ด์—ˆ๋˜ ์ฆ‰ ์ด ์ „์— ๊ฐ’์ด ์—†์—ˆ๋˜ ๊ณณ์— ํ™•์žฅ์œผ๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ๊ฐ’์ด ์ถ”๊ฐ€๋˜์–ด๋„ ์ˆœํšŒํ•  ๋•Œ ๊ทธ ๊ณณ์€ ๊ทธ๋ƒฅ ์ง€๋‚˜์ณ์•ผ ํ•œ๋‹ค. 

์ด๋ ‡๊ฒŒ ๋‚˜์˜ค๊ณ  ๋๋‚ด์•ผ๋˜๋Š”๋ฐ, ๊ณ„์† ์ง„ํ–‰ํ•˜๋ฉด 10 ๋‹ค์Œ 9๋กœ ๊ฐ€์„œ ๋‹ค์‹œ ์ง„ํ–‰๋˜๊ณ , ๊ทธ ๋‹ค์Œ (2,2)์— ์œ„์น˜ํ•œ 9์— ๊ฐ€์„œ ๋˜ ์ง„ํ–‰๋˜์–ด ์—‰๋ง์ง„์ฐฝ์ด ๋  ๊ฒƒ์ด๋‹ค.

 

diffusionDustํ•จ์ˆ˜์—์„œ list ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์กฐ๊ฑด์— ๋งž์œผ๋ฉด i,j ์ธ๋ฑ์Šค์™€ value๊ฐ’์„ ๋„ฃ๊ณ  ๋งˆ์ง€๋ง‰์— ํ•œ๊บผ๋ฒˆ์— ๊ฐ€์ค‘์น˜๋ฅผ ๋”ํ•ด์ฃผ์—ˆ๋‹ค.

 

clockwiseRotation ํ•จ์ˆ˜

 

antiClockwiseRotation ํ•จ์ˆ˜

 
- ๊ฐ๊ฐ ์‹œ๊ณ„๋ฐฉํ–ฅ, ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋„๋Š” ๋ฐฐ์—ด์„ returnํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ƒฅ ๋Œ๋ ค๊ฐ€๋ฉด์„œ ํ–ˆ๋‹ค. ์•„๋งˆ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ ๋‚ฎ์•„ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ shift()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
value๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐ€๋ฉด ์ด ์ „ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ฐ˜๋Œ€๋กœ ๋•ก๊ฒจ์˜ค๋Š” ๋ฐฉ๋ฒ•๋„ ์ƒ๊ฐํ•ด๋ดค์ง€๋งŒ, ์• ์ดˆ์— ๊ฐ’์ด ๋ช…ํ™•ํ•ด ๊ทธ๋ƒฅ 4๋ฒˆ๋งŒ ๋Œ๋ฆฌ๋ฉด ๋๋‚˜๋ฆฌ๋ผ ์ƒ๊ฐํ•˜๊ณ  ์ž‘์„ฑํ•˜๊ณ , ๋‹ค์‹œ ์›๋ž˜ ๋ฐฐ์—ด์— ํ•œ ์นธ์”ฉ ๋ฐ€์–ด์„œ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.
 
 
main์—์„œ airCleanerIdx๋Š” ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๊ฐ€ ์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. (์–ด์ฐจํ”ผ ๊ฐ€๋กœ๋Š” ๋ฌด์กฐ๊ฑด 0์— ์œ„์น˜ํ•˜๋ฏ€๋กœ)
๊ทธ ํ›„ time์„ ํ•˜๋‚˜์”ฉ ๋นผ๊ฐ€๋ฉฐ time์ด 0์ด๋ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๊ฐ’์„ ๊ตฌํ•ด์ฃผ๋ฉด ๋์ด๋‹ค.
 
(rotationํ•จ์ˆ˜๊ฐ€ ๊ฐ๊ฐ returnํ•ด์ฃผ๋Š” ๊ฐ’๋“ค์„ concat์œผ๋กœ ์—ฐ๊ฒฐํ•ด ๋‹ค์‹œ house๋ฐฐ์—ด์— ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค.) 
 
 
์•„๋งˆ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•๋“ค์ด ๋งŽ์„ ๊ฒƒ์ด๋‹ค. ex) ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•ด ์‹œ๊ณ„, ๋ฐ˜์‹œ๊ณ„๋ฅผ ํ•œ ํ•จ์ˆ˜์—์„œ ์ง„ํ–‰ํ•œ๋‹ค๊ฑฐ๋‚˜??
 
 
์œ„ ์ฝ”๋“œ์—์„œ ์•„์‰ฌ์šด ์ ์€ ์‹œ๊ณ„, ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ ๋Œ€์‹  ๊ฐ’์„ ๋•ก๊ฒจ์˜ค๊ธฐ ์œ„ํ•ด ๋ฐ˜๋Œ€๋กœ ๋ฐ€์–ด value๋ฐฐ์—ด ํ•„์š”์—†์ด ๋ฐ”๋กœ ๊ฐ’๋“ค์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค. (์‹ค์ œ๋กœ ์œ„ ์ฝ”๋“œ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋‹ค๋ณด๋‹ˆ reverse๋“ฑ์—์„œ fix๋ฅผ ๋งŽ์ด ๊ฒฝํ—˜ํ–ˆ๋‹ค.)
728x90
๋ฐ˜์‘ํ˜•
Comments