๐Ÿง  codingtest/javascript 100์ œ

๋ฌธ์ œ 96. ๋„“์€ ํ…ƒ๋ฐญ ๋งŒ๋“ค๊ธฐ

awesomeyelim 2022. 4. 29. 11:32
728x90

 

 

 

์˜ˆ๋ฆผ์ด๋Š” ๊ท€๋†์„ ํ•ด์„œ ๋ฐญ๋†์‚ฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ๋งˆ์Œ์„ ๋จน์—ˆ๋‹ค. ํ…ƒ๋ฐญ์— ํฐ ๋ฐ”์œ„๋“ค์€ ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™๋“ค์„ ์ •ํ•˜์˜€๋‹ค.

 

  1. ๋ฐ”์œ„๋ฅผ(๋ฐ”์œ„๋Š” '1'๋กœ ํ‘œ๊ธฐ) ํ”ผํ•ดํ…ƒ๋ฐญ์„ ๋งŒ๋“ค๋˜ ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘์œผ๋กœ ํ…ƒ๋ฐญ์„ ๋งŒ๋“ฌ
  2. ํ…ƒ๋ฐญ์€ ๊ฐ€์žฅ ๋„“์€ ํ…ƒ๋ฐญ 1๊ฐœ๋งŒ ๋งŒ๋“ฆ, ๊ทธ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜.
  3. ๋งŒ๋“  ํ…ƒ๋ฐญ์€ ๋ชจ๋‘ '#' ์œผ๋กœ ์ฒ˜๋ฆฌ

 

๊ฐ€์žฅ ๋„“๊ฒŒ ๋งŒ๋“ค์ˆ˜ ์žˆ๋Š” ํ…ƒ๋ฐญ์˜ ๊ธธ์ด์™€ ํ…ƒ๋ฐญ์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค

// ์ž…๋ ฅ
0 0 0 0 0
0 1 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0

// ์ถœ๋ ฅ
3 x 3

0 0 # # #
0 1 # # #
0 1 # # #
0 0 1 0 0
0 0 0 1 0


// ์ž…๋ ฅ
0 0 0 1 0
0 0 0 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 1 0

// ์ถœ๋ ฅ
2 x 2

# # 0 1 0
# # 0 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 1 0


/* **********๋ฌธ์ œ********** */
const ํ…ƒ๋ฐญ = []; //์ž…๋ ฅ๋ฐ›์€ ํ…ƒ๋ฐญ ๋ฆฌ์ŠคํŠธ
let ๊ฐ€๊พผํ…ƒ๋ฐญ = []; //ํ…ƒ๋ฐญ์„ ๊ฐ€๊พผ ํ›„ ์ €์žฅ๋œ ๋ฆฌ์ŠคํŠธ

// ์ฝ”๋“œ์ž‘์„ฑ

console.log(๊ฐ€๊พผํ…ƒ๋ฐญ)

 

 

๋ฏธ๋ฆฌ ์ƒ๊ฐํ•ด ๋ด์•ผํ•  ๊ฒƒ

์žฌ๊ท€ํ•จ์ˆ˜์™€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Memoization)์„ ๋จผ์ € ์•Œ๊ณ  ๋ฌธ์ œ์— ์ ์šฉํ•ด๋ณด์ž

  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค
function fn(n) {
  if (n === 1 || n === 2) {
    return 1;
  } else {
    return fn(n - 1) + fn(n - 2);
    // fn(6)
    // fn(5) + fn(4)
    // fn(4) + fn(3) + fn(3) + fn(2)
    // fn(3) + fn(2) + fn(2) + fn(1) + fn(2) + fn(1) + fn(2)
    // fn(2) + fn(1) + fn(2) + fn(2) + fn(1) + fn(2) + fn(1) + fn(2)
  }
}

console.log(fn(6));

 

 

 

๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰์ด ๋˜๊ณ  ์žˆ์Œ -> ๋น„ํšจ์œจ์  -> ๊ทธ๋ ‡๋‹ค๋ฉด memoization ์„ ํ™œ์šฉํ•˜์ž !

  • memoization ๊ธฐ๋ฒ•
    : ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•  ๋•Œ, ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋™์ผํ•œ ๊ณ„์‚ฐ์˜ ๋ฐ˜๋ณต ์ˆ˜ํ–‰์„ ์ œ๊ฑฐํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ .
let n = 6;
let memory = Array(n + 1).fill(0); //[ 0, 0, 0, 0, 0, 0, 0 ]

function fn(n) {
  if (n === 1 || n === 2) {
    memory[n] = 1;
    return 1;
  } else if (memory[n] !== 0) {
    // ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ์„ ๋•Œ
    return memory[n];
  } else {
    memory[n] = fn(n - 1) + fn(n - 2);
    console.log(memory[n]);
    return memory[n];
  }
}

// ๋ณ€ํ™”๋˜๋Š” ์–‘์ƒ

// [0, 0, 0, 0, 0, 0, fn(5) + fn(4)]
// [0, 0, 0, 0, 0, fn(4) + fn(3), fn(5) + fn(4)]
// [0, 0, 0, 0, fn(3) + fn(2), fn(4) + fn(3), fn(5) + fn(4)]
// [0, 0, 0, 0, fn(3) + fn(2), fn(4) + fn(3), fn(5) + fn(4)]
// [0, 0, 0, fn(2) + fn(1), fn(3) + fn(2), fn(4) + fn(3), fn(5) + fn(4)]
// [0, 0, 1, fn(2) + fn(1), fn(3) + fn(2), fn(4) + fn(3), fn(5) + fn(4)]
// [0, 1, 1, fn(2) + fn(1), fn(3) + fn(2), fn(4) + fn(3), fn(5) + fn(4)]
// [0, 1, 1, 2, fn(3) + fn(2), fn(4) + fn(3), fn(5) + fn(4)]
// [0, 1, 1, 2, 3, 5, 8]


// 2
// 3
// 5
// 8

console.log(fn(n)); // 8

 

 

 

๋‹ต

let ํ…ƒ๋ฐญ = `0 0 0 0 0
0 1 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0`
  .replace(/1/g, "!")
  .replace(/0/g, "1")
  .replace(/!/g, "0")
  .split("\n");

console.log(ํ…ƒ๋ฐญ);

let ์—ญ์ „ํ…ƒ๋ฐญ = [];
for (let row of ํ…ƒ๋ฐญ) {
  ์—ญ์ „ํ…ƒ๋ฐญ.push(row.split(" "));
}

function sol(์—ญ์ „ํ…ƒ๋ฐญ) {
  const ๋†’์ด = ์—ญ์ „ํ…ƒ๋ฐญ.length;
  const ๋„“์ด = ์—ญ์ „ํ…ƒ๋ฐญ[0].length;
  let max = 0;
  let posx = 0;
  let posy = 0;

  for (let i = 0; i < ๋†’์ด; i++) {
    for (let j = 0; j < ๋„“์ด; j++) {
      ์—ญ์ „ํ…ƒ๋ฐญ[i][j] = parseInt(์—ญ์ „ํ…ƒ๋ฐญ[i][j], 10);
    }
  }
  for (let i = 1; i < ๋†’์ด; i++) {
    for (let j = 1; j < ๋„“์ด; j++) {
      if (์—ญ์ „ํ…ƒ๋ฐญ[i][j] == 1) {
        let min;
        //์ขŒ์ธก์›์†Œ์˜ ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์„ ๊ฒฝ์šฐ
        if (์—ญ์ „ํ…ƒ๋ฐญ[i - 1][j] >= ์—ญ์ „ํ…ƒ๋ฐญ[i][j - 1]) {
          min = ์—ญ์ „ํ…ƒ๋ฐญ[i][j - 1];

          // ์œ—์ธก์›์†Œ์˜ ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์„ ๊ฒฝ์šฐ
        } else if (์—ญ์ „ํ…ƒ๋ฐญ[i - 1][j] <= ์—ญ์ „ํ…ƒ๋ฐญ[i][j - 1]) {
          min = ์—ญ์ „ํ…ƒ๋ฐญ[i - 1][j];
        }

        // ๋Œ€๊ฐ์„  ์›์†Œ์˜ ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฒฝ์šฐ
        if (min >= ์—ญ์ „ํ…ƒ๋ฐญ[i - 1][j - 1]) {
          min = ์—ญ์ „ํ…ƒ๋ฐญ[i - 1][j - 1];
        }
        // ํ˜„์žฌ ๊ธฐ์ค€์ ์ด ๊ทธ๋ฆด์ˆ˜ ์—†๋Š” ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ํ•œ๋ณ€์˜ ๊ธธ์ด
        ์—ญ์ „ํ…ƒ๋ฐญ[i][j] = min + 1;

        // ํ…ƒ๋ฐญ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ํฐ ์ˆซ์ž ์ฐพ๊ธฐ
        if (max < ์—ญ์ „ํ…ƒ๋ฐญ[i][j]) {
          max = ์—ญ์ „ํ…ƒ๋ฐญ[i][j];
          posx = j;
          posy = i;
        }
      }
    }
  }
  // ๋ฐญ์„ # ์œผ๋กœ ํ‘œ๊ธฐ
  for (let i = posy - (max - 1); i < posy + 1; i++) {
    for (let j = posx - (max - 1); j < posx + 1; j++) {
      ์—ญ์ „ํ…ƒ๋ฐญ[i][j] = "#";
    }
  }
  // ์ˆซ์ž๋ฅผ ๋‹ค์‹œ 0๊ณผ 1๋กœ ํ‘œ๊ธฐ
  for (let i = 0; i < ๋†’์ด; i++) {
    for (let j = 0; j < ๋„“์ด; j++) {
      if (์—ญ์ „ํ…ƒ๋ฐญ[i][j] >= 1) {
        ์—ญ์ „ํ…ƒ๋ฐญ[i][j] = 0;
      } else if (์—ญ์ „ํ…ƒ๋ฐญ[i][j] == 0) {
        ์—ญ์ „ํ…ƒ๋ฐญ[i][j] = 1;
      }
    }
  }
  // ๋ฐญ ์ถœ๋ ฅ
  for (let i of ์—ญ์ „ํ…ƒ๋ฐญ) {
    console.log(i);
  }
  // ํฌ๊ธฐ ์ถœ๋ ฅ
  console.log(`${max} x ${max}`);
}

sol(์—ญ์ „ํ…ƒ๋ฐญ);