Skip to content

Conversation

@bona1122
Copy link
Collaborator

๐Ÿ“Œ ํ‘ผ ๋ฌธ์ œ

๐Ÿ“ ๊ฐ„๋‹จํ•œ ํ’€์ด ๊ณผ์ •

N๊ณผ M(1)

// 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)

N๊ณผ M(2)

// 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)

N๊ณผ M(3)

// 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"))

N๊ณผ M(4)

// 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"))

๋ถ€๋ถ„์ˆ˜์—ด์˜ ํ•ฉ

// 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)

๋กœ๋˜

// 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())

์—ฐ์‚ฐ์ž ๋ผ์›Œ๋„ฃ๊ธฐ

// 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)

N-Queen

// 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
}

์†Œ์ˆ˜ ์ฐพ๊ธฐ

// ์†Œ์ˆ˜์ธ์ง€ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜
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
}

์–‘๊ถ๋Œ€ํšŒ

// 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
}

@bona1122 bona1122 self-assigned this Mar 11, 2025
@JooKangsan JooKangsan merged commit 1cbc9eb into codingTestStd:main Mar 13, 2025
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants