- ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ ํต์ฌ์ 'ํด๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ ํ๋จ'ํ๋ ๊ฒ์ด๋ค.
- ์ฌ๊ธฐ์์ ๊ฐ๋ฅ์ฑ์ ์ ๋ง ํจ์๋ฅผ ์ ์ํ๋ฉด์ ํ๋จํ๋ค.
๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ต์ํด์ง๋๊ฒ ์ค์ํ๊ฒ ๊ฐ๋ค.
๋ฌธ์ ํ์ด
ํผ๋ก๋
๋ฌธ์ XX๊ฒ์์๋ ํผ๋ก๋ ์์คํ (0 ์ด์์ ์ ์๋ก ํํํฉ๋๋ค)์ด ์์ผ๋ฉฐ, ์ผ์ ํผ๋ก๋๋ฅผ ์ฌ์ฉํด์ ๋์ ์ ํํํ ์ ์์ต๋๋ค. ์ด๋, ๊ฐ ๋์ ๋ง๋ค ํํ์ ์์ํ๊ธฐ ์ํด ํ์ํ "์ต์ ํ์ ํผ๋ก๋"์ ๋์ ํํ์ ๋ง์ณค์ ๋ ์๋ชจ๋๋ "์๋ชจ ํผ๋ก๋"๊ฐ ์์ต๋๋ค. "์ต์ ํ์ ํผ๋ก๋"๋ ํด๋น ๋์ ์ ํํํ๊ธฐ ์ํด ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ ์ต์ํ์ ํผ๋ก๋๋ฅผ ๋ํ๋ด๋ฉฐ, "์๋ชจ ํผ๋ก๋"๋ ๋์ ์ ํํํ ํ ์๋ชจ๋๋ ํผ๋ก๋๋ฅผ ๋ํ๋ ๋๋ค. ์๋ฅผ ๋ค์ด "์ต์ ํ์ ํผ๋ก๋"๊ฐ 80, "์๋ชจ ํผ๋ก๋"๊ฐ 20์ธ ๋์ ์ ํํํ๊ธฐ ์ํด์๋ ์ ์ ์ ํ์ฌ ๋จ์ ํผ๋ก๋๋ 80 ์ด์ ์ด์ด์ผ ํ๋ฉฐ, ๋์ ์ ํํํ ํ์๋ ํผ๋ก๋ 20์ด ์๋ชจ๋ฉ๋๋ค. ์ด ๊ฒ์์๋ ํ๋ฃจ์ ํ ๋ฒ์ฉ ํํํ ์ ์๋ ๋์ ์ด ์ฌ๋ฌ๊ฐ ์๋๋ฐ, ํ ์ ์ ๊ฐ ์ค๋ ์ด ๋์ ๋ค์ ์ต๋ํ ๋ง์ด ํํํ๋ ค ํฉ๋๋ค. ์ ์ ์ ํ์ฌ ํผ๋ก๋ k์ ๊ฐ ๋์ ๋ณ "์ต์ ํ์ ํผ๋ก๋", "์๋ชจ ํผ๋ก๋"๊ฐ ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด dungeons ๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ ์ ๊ฐ ํํํ ์ ์๋ ์ต๋ ๋์ ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ด ๋ฌธ์ ๋ ๊ฐ ๋์ ์ ํํํ๊ธฐ ์ง์ ํ์ฌ ํผ๋ก๋์ ์ต์ ํ์ ํผ๋ก๋์๋ฅผ ๊ณ์ฐํ์ฌ ๊ฐ์ง์น๊ธฐ๋ฅผ ํ๋ค.
์ฌ๊ธฐ์ ์ ๋งํจ์๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋์ ์ ํ์ธํ๋ ์กฐ๊ฑด๊ณผ ํ์ฌ ํผ๋ก๋๊ฐ ์ต์ํ์ํผ๋ก๋๋ณด๋ค ๋ ์๋ค๋ ์กฐ๊ฑด์ ํฌํจํ๋ค.
if (visited.has(i)) continue
// ํ์ฌํผ๋ก๋์ ์ต์ ํ์ ํผ๋ก๋ ๋น๊ต
const [required, consumed] = dungeons[i]
if (cur < required) continue
function solution(k, dungeons) {
let max = 0
let visited = new Set()
let numOfDungeons = dfs(0, k, 0, visited, 0)
return numOfDungeons
function dfs(level, cur, cnt, visited, max) {
for (let i = 0; i < dungeons.length; i++) {
if (visited.has(i)) continue
// ํ์ฌํผ๋ก๋์ ์ต์ ํ์ ํผ๋ก๋ ๋น๊ต
const [required, consumed] = dungeons[i]
if (cur < required) continue
visited.add(i)
cnt += 1
max = Math.max(max, visited.size)
max = dfs(level + 1, cur - consumed, cnt, visited, max)
visited.delete(i)
}
return max
}
}
N-Queen ์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค
๋ฌธ์ ๊ฐ๋ต ์ค๋ช ๊ฐ๋ก, ์ธ๋ก ๊ธธ์ด๊ฐ n์ธ ์ ์ฌ๊ฐํ์ผ๋ก๋ ์ฒด์คํ์ด ์์ต๋๋ค. ์ฒด์คํ ์์ n๊ฐ์ ํธ์ด ์๋ก๋ฅผ ๊ณต๊ฒฉํ ์ ์๋๋ก ๋ฐฐ์นํ๊ณ ์ถ์ต๋๋ค.์ฒด์คํ์ ๊ฐ๋ก ์ธ๋ก์ ์ธ๋ก์ ๊ธธ์ด n์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, n๊ฐ์ ํธ์ด ์กฐ๊ฑด์ ๋ง์กฑ ํ๋๋ก ๋ฐฐ์นํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ฅผ returnํ๋ solutionํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์. ์ ํ์ฌํญ ํธ(Queen)์ ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด์ n์ด 4์ธ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ํธ์ ๋ฐฐ์นํ๋ฉด n๊ฐ์ ํธ์ ์๋ก๋ฅผ ํ๋ฒ์ ๊ณต๊ฒฉ ํ ์ ์์ต๋๋ค.
ํธ์ ๊ณต๊ฒฉ ๋ฒ์์ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ์ธ ๊ฐ์ ํ, ๊ฐ์ ์ด, ๊ฐ์ ๋๊ฐ์ ์ด๋ผ๋ ์ ๊ณผ ๋ฌธ์ ์์ ๊ฐ๋ก์ธ๋ก ๊ธธ์ด n ๊ณผ n๊ฐ์ ํธ์ ๋๋๋ค ๋ผ๋ ์ ์ ๊ทธ๋ฅ ๋๊ธฐ๋ฉด ์๋๋ค. ์ด ์ ํธ์ด ์์นํ ํ๊ณผ ์ด์๋ ํธ์ ๋์ ์ ์๋ค๋๊ฒ ํ์คํ๋ ๊ฒฐ๊ตญ 1 ํ์ 1๊ฐ์ ํธ ๋ง ๋์ ์ ์๋ค. ๊ทธ๋ผ 2d ์ขํ๋ฅผ ์ํํ๊ธฐ ์ํด ์ด์คfor๋ฌธ์ ์ฌ์ฉํ ํ์๊ฐ ์์ด์ง๋ค. ์ฃผ์ด์ง ํ์์ ์ด๋ ์ด์ ํธ์ ๋์ผ๋ฉด ๋๋๊ฐ๋ฅผ ๊ณ ๋ฏผํ๋ฉด ๋๋ค.
function solution(n) {
let cnt = 0
const isVisited_col = new Array(n).fill(-1) // isVisited_col[i] = j : i๋ฒ์งธ ๋ง (ํ) ์ j๋ฒ์งธ ์ด์ ๋์ฌ์๋ค.
function isValidToPutQueen(currentX, currentY, prevX, prevY) {
//chessboard ์ 8๋ฐฉํฅ์ผ๋ก ํธ์ด ์๋์ง ํ์ธํ๋ค.
//ํธ์ด ์๋ค๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค.
// 1. ๊ฐ์ ์ด์ ํธ์ด ์๋์ง ํ์ธ.
if (currentY === prevY) return false
// 2. ๋๊ฐ์ ์ค๋ฅธ์ชฝ์ ํธ์ด ์๋์ง ํ์ธ
if (currentX + currentY === prevX + prevY) return false
// 3. ๋๊ฐ์ ์ผ์ชฝ์ ํธ์ด ์๋์ง ํ์ธ
if (currentX - currentY === prevX - prevY) return false
return true
}
function recursiveNQueen(level) {
if (level === n) {
cnt += 1 //ํ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๋ฅผ ์ฐพ์
return
}
//๋ฐฑํธ๋ํน์ ์ ์ฉํ ๋ฒ์
// nThQueen ์ ๋์ ์ ์๋ ์์น(์ด = col)๋ฅผ ์ฐพ๋๋ค.
// ์ฐพ๋ ๋ค๋๊ฒ์ ํ์ํ๋ค๋ ๊ฒ๊ณผ ๊ฐ์ ์๋ฏธ์ด๋ฉฐ , ์ฌ๊ธฐ์ ๋ฐฑํธ๋ํน์ ํ์์ ํ ๋,
// ํ์ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ๊ฑฐํ๋ ๊ฒ์ด๋ค.
for (let i = 0; i < n; i++) {
let isFinalValid = true // ์ ํํ ์ ์๋ ์ด์ธ์ง ํ์ธํ๊ธฐ ์ํ ์์
์ ๋ค์ด๊ฐ๊ธฐ ์ ์ isFinalValid๋ฅผ true๋ก ์ด๊ธฐํ ํด์ค๋๋ค.
for (let row = 0; row < level; row++) {
// ์ฐฉ๊ฐํ์ง ๋ง๊ฒ : row๋ฅผ ๋ชจ๋ ํ์ธํด์ ํธ์ด ์์ด์ผ i์๋ฆฌ์ ํธ์ ๋์์ ์์ต๋๋ค.
if (!isValidToPutQueen(level, i, row, isVisited_col[row])) {
isFinalValid = false
// isVisited_col[level] = i;
// false๋ผ๋ฉด ๋์ด์ ํ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์๋ํ๋ฉด ๋ชจ๋ validํด์ผ ์ต์ข
์ ์ผ๋ก validํ๊ธฐ ๋๋ฌธ์ด์์.
break
}
}
if (!isFinalValid) continue
// ํธ์ ๋์ ์ ์์.
isVisited_col[level] = i
recursiveNQueen(level + 1, cnt)
isVisited_col[level] = -1
}
}
recursiveNQueen(0)
return cnt
}
ํ๊ณ
์ด๋ฒ์ฃผ๋ ๋ฌธ์ ๋ฅผ ๊ฑฐ์ ํ์ง ๋ชปํ๋ค. ๋จ์ ๊ธฐ๊ฐ์ ๋ณด์ถฉ ํด์ ํ์ด๋ด์ผ๊ฒ ๋ค.