Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions bona1122/[week8]BackTracking/Archery_competition.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// https://school.programmers.co.kr/learn/courses/30/lessons/92342
// ํ•ต์‹ฌ์€ 1. ๊ฐ ์ ์ˆ˜์— ๋Œ€ํ•ด ์ด๊ธธ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ
// 2. ์ด๊ธธ ๋•Œ, ์ตœ์†Œํ•œ์˜ ํ™”์‚ด ์‚ฌ์šฉํ•˜๊ธฐ - ์–ดํ”ผ์น˜๋ณด๋‹ค 1๊ฐœ๋งŒ ๋” ์˜๋ฉด๋จ. => ์ตœ๊ณ ์ ์ˆ˜ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ™”์‚ด ํšจ์œจ์  ์‚ฌ์šฉ, ๊ทธ๋ฆฌ๊ณ  ๋‚ฎ์€์ ์ˆ˜๋ฅผ ๋งŽ์ด ๋งž์ถ”๋Š”๊ฒŒ ์šฐ์„ ๋˜๋ฏ€๋กœ

function solution(n, info) {
let maxDiff = 0
let answer = [-1]
let lion = Array(11).fill(0)

// level์€ ํ˜„์žฌ ๊ฒ€์‚ฌ ์ค‘์ธ ์ ์ˆ˜(0๋ถ€ํ„ฐ ์‹œ์ž‘), count๋Š” ๋‚จ์€ ํ™”์‚ด ์ˆ˜
function dfs(level, count) {
if (level == 10) {
lion[level] = count // ๋‚จ์€ ํ™”์‚ด์€ ๋ชจ๋‘ 0์ ์— ์‚ฌ์šฉ

let sum = 0
for (let i = 0; i < 10; i++) {
if (lion[i] > info[i]) {
// ๋ผ์ด์–ธ์ด ์ ์ˆ˜ ํš๋“
sum = sum + (10 - i)
} else if (lion[i] === info[i] && lion[i] === 0) {
// ๋‘˜๋‹ค ์ ์ˆ˜ํš๋“ ๋ชปํ•จ
continue
} else if (lion[i] === info[i] || lion[i] < info[i]) {
// ์–ดํ”ผ์น˜๊ฐ€ ์ ์ˆ˜ ํš๋“
if (info[i] > 0) sum = sum - (10 - i)
}
}

if (sum > maxDiff) {
maxDiff = sum
answer = [...lion]
} else if (sum == maxDiff && sum > 0) {
// ์ ์ˆ˜์ฐจ๊ฐ€ ๊ฐ™์œผ๋ฉด ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋” ๋งŽ์ด ๋งžํžŒ ๊ฒฝ์šฐ๋ฅผ ์„ ํƒ
// ๋‚ฎ์€ ์ ์ˆ˜๋ถ€ํ„ฐ ๋น„๊ต
for (let j = 10; j >= 0; j--) {
if (answer[j] == lion[j]) {
continue
} else if (lion[j] > answer[j]) {
answer = [...lion]
break
} else {
break
}
}
}
return
}

// 1. ํ˜„์žฌ ์ ์ˆ˜๋Š” ํฌ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ (ํ™”์‚ด 0๊ฐœ ์‚ฌ์šฉ)
dfs(level + 1, count)

// 2. ํ˜„์žฌ ์ ์ˆ˜์—์„œ ์ด๊ธฐ๋Š” ๊ฒฝ์šฐ (๋‚จ์€ํ™”์‚ด ์žˆ๊ณ , ์–ดํ”ผ์น˜๋ณด๋‹ค 1๊ฐœ ๋” ์‚ฌ์šฉ)
const neededArrows = info[level] + 1
if (count >= neededArrows) {
lion[level] = neededArrows
dfs(level + 1, count - neededArrows)
lion[level] = 0 // ๋ฐฑํŠธ๋ž˜ํ‚น ์ดˆ๊ธฐํ™”
}
}

dfs(0, n)

return maxDiff <= 0 ? [-1] : answer
}
31 changes: 31 additions & 0 deletions bona1122/[week8]BackTracking/Lotto/Lotto.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// https://www.acmicpc.net/problem/6603

const filePath =
process.platform === "linux"
? "/dev/stdin"
: require("path").join(__dirname, "input.txt")
const input = require("fs").readFileSync(filePath).toString().split("\n")
const log = console.log

// k๊ฐœ์˜ ์ˆ˜๋ฅผ ๊ณจ๋ผ ์ง‘ํ•ฉ ๋งŒ๋“ค๊ณ  ๊ทธ ์ˆ˜๋งŒ ๊ฐ€์ง€๊ณ  ๋ฒˆํ˜ธ ์„ ํƒํ•˜๊ธฐ
let answer = ""
for (let i = 0; i < input.length; i++) {
let [k, ...arr] = input[i].split(" ").map(Number)
if (k === 0) break

const selected = Array(6)
const result = []
const dfs = (depth, start) => {
if (depth === 6) {
result.push(selected.join(" "))
return
}
for (let i = start; i < arr.length; i++) {
selected[depth] = arr[i]
dfs(depth + 1, i + 1)
}
}
dfs(0, 0)
answer += result.join("\n") + "\n\n"
}
log(answer.trim())
3 changes: 3 additions & 0 deletions bona1122/[week8]BackTracking/Lotto/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
7 1 2 3 4 5 6 7
8 1 2 3 5 8 13 21 34
0
28 changes: 28 additions & 0 deletions bona1122/[week8]BackTracking/NM1/NM1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// https://www.acmicpc.net/problem/15649

const filePath =
process.platform === "linux"
? "/dev/stdin"
: require("path").join(__dirname, "input.txt")
const input = require("fs").readFileSync(filePath).toString()
const log = console.log

// "์ˆœ์„œ"๊ฐ€ ์žˆ๊ฒŒ, 1-N ์ค‘ "์ค‘๋ณต์—†์ด" M๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฌธ์ œ
const [N, M] = input.split(" ").map(Number)
const selected = Array(M) // ์ด M๊ฐœ๋ฅผ ๊ณ ๋ฅผ ๊ฒƒ์ž„
const visited = Array(N + 1).fill(false) // ์ค‘๋ณต์„ ํƒ ๋ฐฉ์ง€ ์œ„ํ•ด
const dfs = (depth) => {
if (depth === M) {
log(selected.join(" "))
return
}
for (let i = 1; i <= N; i++) {
if (visited[i]) continue
selected[depth] = i
visited[i] = true
dfs(depth + 1)
visited[i] = false
}
}

dfs(0, 1)
1 change: 1 addition & 0 deletions bona1122/[week8]BackTracking/NM1/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
4 2
26 changes: 26 additions & 0 deletions bona1122/[week8]BackTracking/NM2/NM2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// https://www.acmicpc.net/problem/15650

const filePath =
process.platform === "linux"
? "/dev/stdin"
: require("path").join(__dirname, "input.txt")
const input = require("fs").readFileSync(filePath).toString()
const log = console.log

// 1-N ์ค‘ "์ค‘๋ณต์—†์ด" M๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฌธ์ œ, "์˜ค๋ฆ„์ฐจ์ˆœ" ์ •๋ ฌ ํ•„์š”
// => ์˜ค๋ฆ„์ฐจ์ˆœ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด for๋ฌธ์—์„œ start ์ธ๋ฑ์Šค(ํ˜„์žฌ ์„ ํƒํ•œ ์ˆ˜๋ณด๋‹ค ํฐ ์ˆ˜๋ถ€ํ„ฐ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„
const [N, M] = input.split(" ").map(Number)

const selected = Array(M)
const dfs = (depth, start) => {
if (depth === M) {
log(selected.join(" "))
return
}
for (let i = start; i <= N; i++) {
selected[depth] = i
dfs(depth + 1, i + 1)
}
}

dfs(0, 1)
1 change: 1 addition & 0 deletions bona1122/[week8]BackTracking/NM2/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
4 2
28 changes: 28 additions & 0 deletions bona1122/[week8]BackTracking/NM3/NM3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// https://www.acmicpc.net/problem/15651

const filePath =
process.platform === "linux"
? "/dev/stdin"
: require("path").join(__dirname, "input.txt")
const input = require("fs").readFileSync(filePath).toString()
const log = console.log

// 1-N ์ค‘ "์ค‘๋ณต๊ฐ€๋Šฅํ•˜๊ฒŒ" "์ˆœ์„œ" ์žˆ์ด, M๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฌธ์ œ
const [N, M] = input.split(" ").map(Number)
let result = []

const selected = Array(M)
const dfs = (depth) => {
if (depth === M) {
result.push(selected.join(" "))
return
}

for (let i = 1; i <= N; i++) {
selected[depth] = i
dfs(depth + 1)
}
}

dfs(0)
log(result.join("\n"))
1 change: 1 addition & 0 deletions bona1122/[week8]BackTracking/NM3/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
4 2
29 changes: 29 additions & 0 deletions bona1122/[week8]BackTracking/NM4/NM4.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// https://www.acmicpc.net/problem/15652

const filePath =
process.platform === "linux"
? "/dev/stdin"
: require("path").join(__dirname, "input.txt")
const input = require("fs").readFileSync(filePath).toString()
const log = console.log

// 1-N ์ค‘ "์ค‘๋ณต๊ฐ€๋Šฅํ•˜๊ฒŒ" M๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฌธ์ œ, "์˜ค๋ฆ„์ฐจ์ˆœ" ์ •๋ ฌ ํ•„์š”
// => ์˜ค๋ฆ„์ฐจ์ˆœ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด for๋ฌธ์—์„œ start ์ธ๋ฑ์Šค(ํ˜„์žฌ ์„ ํƒํ•œ ์ˆ˜ ์ด์ƒ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„

const [N, M] = input.split(" ").map(Number)
const selected = Array(M)
let result = []

const dfs = (depth, start) => {
if (depth === M) {
result.push(selected.join(" "))
return
}
for (let i = start; i <= N; i++) {
selected[depth] = i
dfs(depth + 1, i)
}
}

dfs(0, 1)
log(result.join("\n"))
1 change: 1 addition & 0 deletions bona1122/[week8]BackTracking/NM4/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
4 2
30 changes: 30 additions & 0 deletions bona1122/[week8]BackTracking/N_Queen.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// https://school.programmers.co.kr/learn/courses/30/lessons/12952

function solution(n) {
let queens = []
const possible = (row, col) => {
for (let [queenRow, queenCol] of queens) {
// ์ด๋ฏธ ๋†“์ธ ํ€ธ๋“ค๊ณผ ๋น„๊ตํ•˜๋ฉฐ, ๋ฐฐ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€.
if (queenRow === row || queenCol === col) return false // ๊ฐ™์€ ํ–‰/์—ด ๋ถˆ๊ฐ€
if (Math.abs(queenRow - row) === Math.abs(queenCol - col)) return false // ๋Œ€๊ฐ์„  ๋ถˆ๊ฐ€
}
return true
}

let cnt = 0
const dfs = (row) => {
if (row === n) {
cnt++
return
}
for (let col = 0; col < n; col++) {
if (possible(row, col)) {
queens.push([row, col])
dfs(row + 1)
queens.pop()
}
}
}
dfs(0)
return cnt
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// https://www.acmicpc.net/problem/14888

const filePath =
process.platform === "linux"
? "/dev/stdin"
: require("path").join(__dirname, "input.txt")
const input = require("fs").readFileSync(filePath).toString().trim().split("\n")
const log = console.log

// N๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด, N-1๊ฐœ์˜ ์—ฐ์‚ฐ์ž
// +, -, x, /. (๋‚˜๋ˆ—์…ˆ์€ ๋ชซ๋งŒ ์ทจํ•˜๊ธฐ, ์Œ์ˆ˜๋ฅผ ์–‘์ˆ˜๋กœ ๋‚˜๋ˆŒ๋–„๋Š” ์–‘์ˆ˜๋กœ๋ฐ”๊พธ์–ด ๋ชซ์ทจํ•˜๊ณ  ์Œ์ˆ˜๋กœ ๋ฐ”๊พธ๊ธฐ)
// ์ตœ๋Œ€, ์ตœ์†Œ ๊ตฌํ•˜๊ธฐ

const N = +input[0]
const arr = input[1].split(" ").map(Number)
const ops = input[2].split(" ").map(Number)
let max = -Infinity
let min = Infinity

const dfs = (depth, acc) => {
if (depth === N - 1) {
max = Math.max(max, acc)
min = Math.min(min, acc)
return
}
for (let i = 0; i < 4; i++) {
if (ops[i] > 0) {
ops[i] -= 1
if (i === 0) {
dfs(depth + 1, acc + arr[depth + 1])
} else if (i === 1) {
dfs(depth + 1, acc - arr[depth + 1])
} else if (i === 2) {
dfs(depth + 1, acc * arr[depth + 1])
} else {
if (acc < 0) {
dfs(depth + 1, -Math.floor(-acc / arr[depth + 1]))
} else {
dfs(depth + 1, Math.floor(acc / arr[depth + 1]))
}
}
ops[i] += 1
}
}
}

dfs(0, arr[0])

log(max + "\n" + min)
3 changes: 3 additions & 0 deletions bona1122/[week8]BackTracking/Operator_insertion/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
6
1 2 3 4 5 6
2 1 1 1
36 changes: 36 additions & 0 deletions bona1122/[week8]BackTracking/Prime_finding.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// ์†Œ์ˆ˜์ธ์ง€ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜
function isPrime(n) {
if (n < 2) return false
if (n === 2) return true // 2๋Š” ์†Œ์ˆ˜
if (n % 2 === 0) return false // ์ง์ˆ˜๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹˜

for (let i = 3; i <= Math.sqrt(n); i += 2) {
if (n % i === 0) return false
}
return true
}

// ์กฐ๊ฐ ์กฐํ•ฉํ•ด์„œ ์†Œ์ˆ˜ ๋ช‡๊ฐœ ๋งŒ๋“ค์ˆ˜ ์žˆ๋Š”์ง€ -> "์ค‘๋ณต์—†์ด" "์ˆœ์„œ์žˆ๊ฒŒ" ๊ณ ๋ฅด๊ธฐ
function solution(numbers) {
const set = new Set()
const visited = Array(numbers.length).fill(false)
const selected = []

const dfs = () => {
if (selected.length > 0) {
const num = Number(selected.join(""))
if (isPrime(num)) set.add(num)
}

for (let i = 0; i < numbers.length; i++) {
if (visited[i]) continue
visited[i] = true
selected.push(+numbers[i])
dfs()
visited[i] = false
selected.pop()
}
}
dfs()
return set.size
}
47 changes: 47 additions & 0 deletions bona1122/[week8]BackTracking/Subsequence_Sum/Subsequence_sum.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// https://www.acmicpc.net/problem/1182

const filePath =
process.platform === "linux"
? "/dev/stdin"
: require("path").join(__dirname, "input.txt")
const input = require("fs").readFileSync(filePath).toString().split("\n")
const log = console.log

// ํฌ๊ธฐ๊ฐ€ ์–‘์ˆ˜์ธ ๋ถ€๋ถ„์ˆ˜์—ด ์ค‘, ์›์†Œ๋ฅผ ๋‹ค ๋”ํ•œ ๊ฐ’์ด S๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
const [N, S] = input[0].split(" ").map(Number)
const arr = input[1].split(" ").map(Number)
let count = 0

// 1. ๋น„ํŠธ๋งˆ์Šคํ‚น์„ ํ™œ์šฉํ•œ ๋ถ€๋ถ„์ง‘ํ•ฉ ์™„์ „ํƒ์ƒ‰
// i = 1 ๋ถ€ํ„ฐํ•ด์„œ, ํฌ๊ธฐ๊ฐ€ 0์ธ ๋ถ€๋ถ„์ง‘ํ•ฉ ์ œ์™ธ
for (let i = 1; i < 1 << N; i++) {
let sum = 0
for (let j = 0; j < N; j++) {
// j๋ฒˆ์งธ ์›์†Œ๊ฐ€ ๋ถ€๋ถ„์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด
if (i & (1 << j)) sum += arr[j]
}
if (sum === S) count++
}
// log(count)

// 2. ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ™œ์šฉํ•œ ๋ถ€๋ถ„์ง‘ํ•ฉ ์™„์ „ํƒ์ƒ‰
const selected = Array(N).fill(false)
let cnt = 0
const dfs = (depth) => {
if (depth === N) {
let sum = 0
for (let i = 0; i < selected.length; i++) {
if (selected[i]) sum += arr[i]
}
if (sum === S) cnt++
return
}
dfs(depth + 1) // ์„ ํƒ์•ˆํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ

// ์„ ํƒํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ
selected[depth] = true
dfs(depth + 1)
selected[depth] = false
}
dfs(0)
log(S === 0 ? --cnt : cnt)
Loading
Loading