๐Ÿ“ algorithm

[๋ฐฑ์ค€] ๋น—๋ฌผ - JavaScript ํ’€์ด

c0zi 2025. 2. 11. 11:15

์˜ค๋žœ๋งŒ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด๋ฅผ ๋‹ค์‹œ ๋ธ”๋กœ๊ทธ์— ์˜ฌ๋ฆฌ๊ฒŒ ๋œ ์ด์œ ๊ฐ€ ๋‘๊ฐ€์ง€ ์žˆ๋‹ค.

์ฒซ๋ฒˆ์งธ๋กœ, ๋ฌธ์ œ ํ’€๊ณ  ๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋ณด๊ฑฐ๋‚˜ ๊ณ ๋ฏผํ•˜๋Š” ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™์•„์„œ์ด๋‹ค.

 

๊ณจ๋“œ ๋ฌธ์ œ๋กœ ์˜ฌ๋ผ์˜ค๋‹ˆ๊นŒ ํ•œ ๋ฌธ์ œ ํ’€์ด์—๋„ ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ, ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ๋‚œ ๋’ค์— ์‹œ๊ฐ„์„ ๋งŽ์ด ์•ˆ๋“ค์ด๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ๋ฌธ์ œ ํ’€์ด ๋ฐฉ์‹๋„ ํ•œ์ •์ ์ด๊ณ  ๋” ํ‹ฐ์–ด ๋†’์•„์ง€๋ฉด ๋ชป ํ‘ธ๋Š” ๋ฌธ์ œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์งˆ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

์—ฌ๋Ÿฌ ๋ฐฉ์‹์˜ ๋ฌธ์ œ ํ’€์ด๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ๋ธ”๋กœ๊ทธ์— ์˜ฌ๋ฆฌ๋ฉด ๋‚˜๋„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐˆ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒŒ ์ฒซ๋ฒˆ์งธ ์ด์œ ๋‹ค.

 

๋‘๋ฒˆ์งธ๋กœ, ๋ณ€์ˆ˜๋ช…์„ ์ข€ ๋” ์‹ ๊ฒฝ ์“ฐ๊ณ  ์‹ถ์–ด์กŒ๋‹ค.

 

๋ถ€ํŠธ์บ ํ”„ ๋‹ค๋‹ˆ๋ฉด์„œ ๋ฌธ์ œ ํ’€ ๋•Œ๋„ ๊ทธ๋ ‡๊ณ  ํ”„๋กœ์ ํŠธ ํ•  ๋•Œ๋„ ์‚ฌ์‹ค ๋ณ€์ˆ˜๋ช…์— ํฌ๊ฒŒ ์‹ ๊ฒฝ์„ ์•ˆ์ผ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•œ๋ฒˆ ํ’€๊ณ  ๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋Š” ํŠนํžˆ.

๊ทธ๋ฆฌ๊ณ  ๋ณ€์ˆ˜๋ช…์ด ๊ธธ๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฐ•๋ฐ•๊ฐ™์€ ๊ฒŒ ์žˆ์—ˆ๋Š”๋ฐ, ๋ฉฐ์น ์ „ ๋ณ€์ˆ˜๋ช…๋ช…์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด๋‹ค๊ฐ€ 10 ~ 16์ž ์‚ฌ์ด ๋ณ€์ˆ˜๋ช…์ด ๋””๋ฒ„๊น…ํ•˜๊ธฐ ๊ฐ€์žฅ ์ข‹๋‹ค๋Š” ๋‚ด์šฉ์„ ๋ณด๊ณ  ๋ณ€์ˆ˜๋ช…์„ ๋” ์ง๊ด€์ ์œผ๋กœ ์ง“๋Š” ์—ฐ์Šต์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

์ด๋Ÿฐ ์ด์œ ์—์„œ ํ•˜๋ฃจ ํ•œ ๋ฌธ์ œ์”ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด๋ฅผ ์˜ฌ๋ ค๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


๐Ÿ’™ ๋ฌธ์ œ ์„ค๋ช…

 

2์ฐจ์› ์„ธ๊ณ„์— ๋ธ”๋ก์ด ์Œ“์—ฌ์žˆ๋‹ค. ๋น„๊ฐ€ ์˜ค๋ฉด ๋ธ”๋ก ์‚ฌ์ด์— ๋น—๋ฌผ์ด ๊ณ ์ธ๋‹ค.

 

 

๋น„๋Š” ์ถฉ๋ถ„ํžˆ ๋งŽ์ด ์˜จ๋‹ค. ๊ณ ์ด๋Š” ๋น—๋ฌผ์˜ ์ด๋Ÿ‰์€ ์–ผ๋งˆ์ผ๊นŒ?

 

๐Ÿ’› ์ž…๋ ฅ

 

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” 2์ฐจ์› ์„ธ๊ณ„์˜ ์„ธ๋กœ ๊ธธ์ด H๊ณผ 2์ฐจ์› ์„ธ๊ณ„์˜ ๊ฐ€๋กœ ๊ธธ์ด W๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ H, W ≤ 500)

๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ธ”๋ก์ด ์Œ“์ธ ๋†’์ด๋ฅผ ์˜๋ฏธํ•˜๋Š” 0์ด์ƒ H์ดํ•˜์˜ ์ •์ˆ˜๊ฐ€ 2์ฐจ์› ์„ธ๊ณ„์˜ ๋งจ ์™ผ์ชฝ ์œ„์น˜๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ W๊ฐœ ์ฃผ์–ด์ง„๋‹ค.

๋”ฐ๋ผ์„œ ๋ธ”๋ก ๋‚ด๋ถ€์˜ ๋นˆ ๊ณต๊ฐ„์ด ์ƒ๊ธธ ์ˆ˜ ์—†๋‹ค. ๋˜ 2์ฐจ์› ์„ธ๊ณ„์˜ ๋ฐ”๋‹ฅ์€ ํ•ญ์ƒ ๋ง‰ํ˜€์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ๋„ ์ข‹๋‹ค.

 

๐Ÿ’š ์ถœ๋ ฅ

 

2์ฐจ์› ์„ธ๊ณ„์—์„œ๋Š” ํ•œ ์นธ์˜ ์šฉ๋Ÿ‰์€ 1์ด๋‹ค. ๊ณ ์ด๋Š” ๋น—๋ฌผ์˜ ์ด๋Ÿ‰์„ ์ถœ๋ ฅํ•˜์—ฌ๋ผ.

๋น—๋ฌผ์ด ์ „ํ˜€ ๊ณ ์ด์ง€ ์•Š์„ ๊ฒฝ์šฐ 0์„ ์ถœ๋ ฅํ•˜์—ฌ๋ผ.

 


โค๏ธ ๋ฌธ์ œ ํ’€์ด ๋ฐฉ๋ฒ•

ํ•ญ์ƒ ๋ฌธ์ œ๋“ค์„ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ‘ธ๋Š” ์Šต๊ด€์ด ๋˜ ๋„์กŒ๋‹ค....

๊ทผ๋ฐ H, W๊ฐ€ 500์ดํ•˜๋ผ์„œ ์‹œ๊ฐ„๋ณต์žก๋„์—๋Š” ์•ˆํ„ฐ์กŒ๋‹ค.

 

๊ทธ๋ž˜๋„ ์•ž์œผ๋กœ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๊ณ  ๋” ์ข‹์€ ๋ฐฉ์‹์„ ํƒ๊ตฌํ•ด๋ณด๊ณ  ์‹ถ์–ด์ ธ์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด๋ฒ•์„ ์ ๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

1๏ธโƒฃ ๋ธŒ๋ฃจํŠธํฌ์Šค (์™„์ „ํƒ์ƒ‰)

๊ฐ€์žฅ ๋จผ์ €, ์ง๊ด€์ ์œผ๋กœ ์ตœ๋Œ€ height๋ฅผ ๊ธฐ์ค€์œผ๋กœ height๋ฅผ 1์”ฉ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ๋„“์ด๋ฅผ ๊ตฌํ•˜๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š”, ๋ฌธ์ œ ์กฐ๊ฑด์ธ ๋†’์ด์™€ ๋„ˆ๋น„๊ฐ€ 500์ดํ•˜๋ผ์„œ O(H * W)์ด๋‹ค.

 

const fs = require("fs");
// TODO: ์ œ์ถœ ์‹œ ๊ฒฝ๋กœ ๋ณ€ํ™˜ ํ•„์ˆ˜ ("/dev/stdin")
const input = fs.readFileSync("test.txt", "utf8").toString().trim().split("\n");

function solution(input) {
  const [worldHeight, worldWidth] = input[0].split(" ").map(Number);
  let areaSum = 0;
  let maxHeight = -1;
  const blockHeightArray = input[1].split(" ").map((str) => {
    num = Number(str);
    maxHeight = Math.max(maxHeight, num);
    return num;
  });

  // ์ตœ๋Œ€ ๋†’์ด๊ฐ€ 0์ผ ๋•Œ๊นŒ์ง€ ํ•œ์ธต์”ฉ ๊ณ„์‚ฐ
  while (maxHeight !== 0) {
    // maxHeight๋กœ ์‹œ์ž‘ํ•˜๋Š” startIndex
    let startIndex = -1;

    // ๋ธ”๋ก์˜ ๋†’์ด๊ฐ€ ์ €์žฅ๋œ ๋ฐฐ์—ด ์ˆœํšŒ
    for (
      let blockIndex = 0;
      blockIndex < blockHeightArray.length;
      blockIndex++
    ) {
      // ์ตœ๋Œ€ ๋†’์ด๋ณด๋‹ค ํ˜„์žฌ ๋ธ”๋ก์˜ ๋†’์ด๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ๋” ๋†’์€ ๊ฒฝ์šฐ
      if (maxHeight <= blockHeightArray[blockIndex]) {
        if (startIndex === -1) {
          startIndex = blockIndex;
          continue;
        }

        areaSum += blockIndex - startIndex - 1;
        startIndex = blockIndex;
      }
    }

    maxHeight--;
  }

  return areaSum;
}

console.log(solution(input));

 

 

2๏ธโƒฃ ํˆฌํฌ์ธํ„ฐ

์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ ํ’€์ด ํ›„, ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋” ์ค„์ผ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด๋ดค๋‹ค.

์ธ์ ‘ ๋ฐฐ์—ด๋ผ๋ฆฌ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋งŒ ์ƒ๊ฐํ•˜๋‹ˆ๊นŒ ๋”ฑํžˆ ๋ฐฉ๋ฒ•์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์•„์„œ ๋งž์€ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ดค๋‹ค.

ํˆฌํฌ์ธํ„ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฑธ ์ƒ๊ฐ ๋ชปํ–ˆ๋˜๊ฒŒ ์กฐ๊ธˆ ์•„์‰ฌ์› ๋‹ค.

 

ํˆฌํฌ์ธํ„ฐ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ ํ’€์ดํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–‘ ๋์„ ๋น„๊ตํ•ด์„œ ๋‘˜ ์ค‘ ๋†’์ด๊ฐ€ ๋” ๋‚ฎ์€ ๋ธ”๋ก์„ ๊ธฐ์ค€์œผ๋กœ, ์‚ฌ์ด๊ฐ’๋“ค์„ ๋น„๊ตํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋กœ์ง์„ ์ž์„ธํžˆ ์ ์–ด๋ณด๋ฉด

 

1) ์™ผ์ชฝ์˜ ๋†’์ด๊ฐ€ ๋” ๋‚ฎ์œผ๋ฉด

2) ์ง€๊ธˆ๊นŒ์ง€์˜ ๋†’์ด๋“ค๋ณด๋‹ค ๋†’์€์ง€ ํŒ๋‹จํ•˜๊ณ , ๋งž๋‹ค๋ฉด ๊ฐฑ์‹ ํ•œ๋‹ค

3) ์ง€๊ธˆ๊นŒ์ง€์˜ ๋†’์ด๋“ค ์ค‘ ๊ฐ€์žฅ ๋†’์ง€ ์•Š๋‹ค๋ฉด, ๋“ค์–ด๊ฐ„ ๋ถ€๋ถ„์ด๋‹ˆ๊นŒ ๋น—๋ฌผ์ด ๊ณ ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ์ข… ๋„“์ด์— ๋”ํ•ด์ค€๋‹ค

4) ํฌ์ธํ„ฐ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•œ๋‹ค

 

const fs = require("fs");
// TODO: ์ œ์ถœ ์‹œ ๊ฒฝ๋กœ ๋ณ€ํ™˜ ํ•„์ˆ˜ ("/dev/stdin")
const input = fs.readFileSync("test.txt", "utf8").toString().trim().split("\n");

function solution(input) {
  const [worldHeight, worldWidth] = input[0].split(" ").map(Number);
  const blockHeight = input[1].split(" ").map(Number);
  let areaSum = 0;
  let [left, right] = [0, worldWidth - 1];
  let [maxLeftHeight, maxRightHeight] = [0, 0];

  // ์™ผ์ชฝ ์ธ๋ฑ์Šค๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ ์ธ๋ฑ์Šค๊ฐ€ ๋” ํด ๋•Œ ๋ฐ˜๋ณต
  while (left < right) {
    // ์™ผ์ชฝ ํฌ์ธํ„ฐ์˜ ๋†’์ด๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ ๋†’์ด๊ฐ€ ๋” ํฐ ๊ฒฝ์šฐ
    if (blockHeight[left] < blockHeight[right]) {
	  // ์™ผ์ชฝ์˜ ๊ฐ’๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’๊ณผ ๋น„๊ต
      if (maxLeftHeight <= blockHeight[left]) {
        maxLeftHeight = blockHeight[left];
      } else {
        // ๋“ค์–ด๊ฐ„๋งŒํผ ๋”ํ•ด์ค€๋‹ค
        areaSum += maxLeftHeight - blockHeight[left];
      }
      left++;
    } else {
      if (maxRightHeight <= blockHeight[right]) {
        maxRightHeight = blockHeight[right];
      } else {
        areaSum += maxRightHeight - blockHeight[right];
      }
      right--;
    }
  }
  return areaSum;
}

console.log(solution(input));

 

๋ฌธ์ œ ํ’€์ด์—์„œ ๋” ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์ด ์žˆ๊ฑฐ๋‚˜, ์ข‹์€ ๋ณ€์ˆ˜๋ช…์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.