๐ง codingtest/javascript 100์
๋ฌธ์ 96. ๋์ ํ ๋ฐญ ๋ง๋ค๊ธฐ
awesomeyelim
2022. 4. 29. 11:32
728x90
์๋ฆผ์ด๋ ๊ท๋์ ํด์ ๋ฐญ๋์ฌ๋ฅผ ์์ํ๊ธฐ๋ก ๋ง์์ ๋จน์๋ค. ํ ๋ฐญ์ ํฐ ๋ฐ์๋ค์ ์ ๊ฑฐํ์ง ๋ชปํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๊ท์น๋ค์ ์ ํ์๋ค.
- ๋ฐ์๋ฅผ(๋ฐ์๋ '1'๋ก ํ๊ธฐ) ํผํดํ ๋ฐญ์ ๋ง๋ค๋ ์ ์ฌ๊ฐํ ๋ชจ์์ผ๋ก ํ ๋ฐญ์ ๋ง๋ฌ
- ํ ๋ฐญ์ ๊ฐ์ฅ ๋์ ํ ๋ฐญ 1๊ฐ๋ง ๋ง๋ฆ, ๊ทธ ํฌ๊ธฐ๋ฅผ ๋ฐํ.
- ๋ง๋ ํ ๋ฐญ์ ๋ชจ๋ '#' ์ผ๋ก ์ฒ๋ฆฌ
๊ฐ์ฅ ๋๊ฒ ๋ง๋ค์ ์๋ ํ ๋ฐญ์ ๊ธธ์ด์ ํ ๋ฐญ์ ์ถ๋ ฅํ์์ค
// ์
๋ ฅ
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(์ญ์ ํ
๋ฐญ);