๊ฐœ๋ฐœ ๊ณต๋ถ€/๋ฐ๋ธŒ์ฝ”์Šค TIL

[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240126 - ๊ณ ์–‘์ด ์‚ฌ์ง„์ฒฉ ๋งŒ๋“ค๊ธฐ ๊ณผ์ œํ…Œ์ŠคํŠธ, Lv2 ์ฝ”๋”ฉํ…Œ์ŠคํŠธ

๊ฐ€์šค์ด 2024. 1. 26. 22:26

Intro


์ƒˆ๋กœ์šด ๊ณผ์ œ ํ…Œ์ŠคํŠธ๋ฅผ ํ’€์—ˆ๋‹ค. ๊ณผ์ œํ…Œ์ŠคํŠธ๋„ ์—ฌ๋Ÿฌ๋ฒˆ ํ‘ธ๋‹ˆ๊นŒ ์ต์ˆ™ํ•ด์ง€๊ณ  ์‹ค๋ ฅ์ด ๋А๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ˜

ํ•„์ˆ˜ ๊ตฌํ˜„ ๋ฌธ์ œ์—์„œ ์ด์ „ ๋ฒ„ํŠผ ๊ตฌํ˜„ํ•˜๋‹ค๊ฐ€ ์ €๋… ์•ฝ์† ๋•Œ๋ฌธ์— 30๋ถ„ ์ „์— ์ œ์ถœ์„ ํ•ด๋ฒ„๋ ธ๋‹ค ์•„์‰ฝ ใ…  ํ’€ ์ˆ˜ ์žˆ์—ˆ๋Š”๋Ž…

์˜ต์…˜ ๊ตฌํ˜„ ๋ฌธ์ œ๋Š” ๋ชจ๋‹ฌ ์ฐฝ ๋‹ซ๋Š” ๊ฑฐ ํ•˜๋‚˜ ํ’€์—ˆ๋‹ค. ๋‹ค ๊ตฌํ˜„ํ•˜๊ธฐ์—๋Š” ์‹œ๊ฐ„์ด ๋งค์šฐ ๋งค์šฐ ๋ถ€์กฑํ•˜๋‹ค.

์•„์ง ์‹ค๋ ฅ์ด ๋งŽ์ด ๋ถ€์กฑํ•œ๊ฐ€๋ณด๋‹น...

๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜ ๋‚จ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋„ ํ’€์—ˆ๋”ฐ. ๐Ÿ˜ƒ

 

 

 

์˜ค๋Š˜ ํ•™์Šตํ•œ ๋‚ด์šฉ

: ๊ณผ์ œํ…Œ์ŠคํŠธ (๊ณ ์–‘์ด ์‚ฌ์ง„์ฒฉ ๋งŒ๋“ค๊ธฐ), ์ฝ”๋”ฉํ…Œ์ŠคํŠธ


๊ณผ์ œํ…Œ์ŠคํŠธ - ๊ณ ์–‘์ด ์‚ฌ์ง„์ฒฉ ๋งŒ๋“ค๊ธฐ

๋ฌธ์ œ
๋‹น์‹ ์€ ๊ณ ์–‘์ด๋“ค์„ ๋ชจ์‹œ๊ณ  ์žˆ๋Š” ์–ด๋А ์ง‘์‚ฌ์—๊ฒŒ ์ž์‹ ์˜ ๊ณ ์–‘์ด ์‚ฌ์ง„์„ ๊ด€๋ฆฌํ•ด๋‹ฌ๋ผ๋Š” ์˜๋ขฐ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
์˜๋ขฐ์ธ์€ ๋‹น์‹ ์ด ๋ฏฟ์„๋งŒํ•œ ์‚ฌ๋žŒ์ธ์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด, ์•ฝ๊ฐ„์˜ ์‚ฌ์ง„์„ ๋‹น์‹ ์—๊ฒŒ ๋ณด๋ƒˆ์œผ๋ฉฐ ์ด ์‚ฌ์ง„๋“ค์„ ์›น์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹ฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์ด ์‚ฌ์ง„์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ ๊ณ ๋ฏผ ์ค‘์ด๋˜ ๋•Œ, ๋‹น์‹ ์˜ ์ ˆ์นœํ•œ ์นœ๊ตฌ Back-end ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹น์‹ ์„ ๋•๊ธฐ ์œ„ํ•ด ์˜๋ขฐ์ธ์ด ๋ณด๋‚ธ ์‚ฌ์ง„๋“ค์„ API ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด API๋ฅผ ์ด์šฉํ•ด, ์˜๋ขฐ์ธ์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ณ ์–‘์ด ์‚ฌ์ง„์ฒฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค!

 

๊ณ ์–‘์ด ํด๋”๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

ํด๋”๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ํด๋”๋กœ ์ด๋™ํ•˜๊ณ , ํŒŒ์ผ์„ ๋ˆ„๋ฅด๋ฉด ์‚ฌ์ง„์ด ๋œจ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  root๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ์—๋Š” ์ด์ „ ๋ฒ„ํŠผ์ด ๋œจ๊ณ  ์ด์ „ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ์‹œ ์ƒ์œ„ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑธ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

๋จผ์ €, ES6 ๋ชจ๋“ˆํ™”๋ถ€ํ„ฐ ์ง„ํ–‰ํ–ˆ๋‹ค.

 

 

main์—์„œ div[class=App] ์š”์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์™€ App ํด๋ž˜์Šค์— ์ „๋‹ฌํ•ด์ฃผ๊ณ  App ํด๋ž˜์Šค์— Breadcrumb, Modal, Nodes ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํ˜ธ์ถœํ–ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ์ข…๋ฅ˜๋กœ๋Š” ์ƒ๋‹จ์— ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๋Š” Breadcrumb ์ปดํฌ๋„ˆํŠธ์™€ ํด๋” ๋‚ด์˜ ํŒŒ์ผ, ํด๋” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” Nodes ์ปดํฌ๋„ŒํŠธ, ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ชจ๋‹ฌ์ฐฝ์„ ๋„์šฐ๋Š” Modal ์ปดํฌ๋„ŒํŠธ๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค.

 

 


  • Breadcrumb.js
class Breadcrumb {
  filePath = ['root']

  constructor({ $target }) {
    const $breadcrumb = document.createElement('nav')
    this.$breadcrumb = $breadcrumb
    this.$breadcrumb.className = 'Breadcrumb'
    $target.appendChild(this.$breadcrumb)

    this.render()
  }

  nextRoute(name) {
    const filePath = [ ...this.filePath ]
    filePath.push(name)
    this.setState(filePath)
  }

  prevRoute() {
    const filePath = [ ...this.filePath ]
    filePath.pop()
    this.setState(filePath)
    return filePath[filePath.length-1]
  }

  setState(newData) {
    this.filePath = newData
    this.render()
  }

  render() {
    this.$breadcrumb.innerHTML = this.filePath.map(nav => `
      <div>${nav}</div>
    `).join('')
  }
}

export default Breadcrumb

 

๋ฐฐ์—ด์— ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  map์„ ๋Œ๋ฉฐ ์š”์†Œ์— ์ถ”๊ฐ€ํ–ˆ๋‹ค.

ํด๋”๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค nextRoute๋กœ ํด๋” ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด์ „ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด prevRoute ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ–ˆ๋‹ค.

 

 


  • Nodes.js
const PREV_IMG_SRC = './assets/prev.png'
const TYPES = {
  DIRECTORY: 'directory',
  FILE: 'file'
}

class Nodes {
  data = {
    isRoot: true,
    items: []
  }

  constructor({ $target, onChangeNode, onPrevPage, onShowImg }) {
    const $nodes = document.createElement('div')
    this.$nodes = $nodes
    this.$nodes.className = 'Nodes'
    $target.appendChild(this.$nodes)

    this.onChangeNode = onChangeNode
    this.onPrevPage = onPrevPage
    this.onShowImg = onShowImg

    this.render()
  }

  renderPrevImg() {
    const $prevNode = document.createElement('div')
    $prevNode.className = 'Node'
    $prevNode.dataset.type = 'PREV_BTN'
    const $prevImg = document.createElement('img')
    $prevImg.src = PREV_IMG_SRC
    $prevNode.appendChild($prevImg)
    this.$nodes.appendChild($prevNode)
  }

  setState(newData) {
    this.data = { ...this.data, ...newData }
    this.render()
  }

  render() {
    this.$nodes.innerHTML = ''
    if(this.data.items?.length) {
      if(!this.data.isRoot) this.renderPrevImg()
      this.$nodes.innerHTML += this.data.items.map(({ id, name, type, filePath, parent }) => `
        <div class="Node" data-id=${id} data-type=${type} data-name=${name} data-path=${filePath}>
          <img src="./assets/${TYPES[type]}.png">
          <div>${name}</div>
        </div>
      `).join('')
    }

    this.$nodes.querySelectorAll('.Node').forEach(item => {
      item.addEventListener('click', e => {
        const { id, name, type, path } = e.currentTarget.dataset

        if(type === 'DIRECTORY') {
          this.onChangeNode(id, name)
        } else if(type === 'FILE') {
          this.onShowImg(path)
        } else if(type === 'PREV_BTN') {
          this.onPrevPage()
        }
      })
    })
  }
}

export default Nodes

 

์ด์ „ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ด์ „ ๋ฃจํŠธ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋ถ€๋ถ„์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ ์‹œ๊ฐ„์ƒ ํ•ด๊ฒฐ ๋ชปํ•˜๊ณ  ์ œ์ถœํ–ˆ๋‹ค.

๋…ธ๋“œ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ DIRECTORY์ธ์ง€ FILE์ธ์ง€ ๊ตฌ๋ถ„ํ•ด์„œ DIRECTORY๋ฉด ๋…ธ๋“œ๋ฅผ ์ด๋™ํ•˜๊ณ  FILE์ด๋ฉด ๋ชจ๋‹ฌ์ฐฝ์ด ์‹คํ–‰๋˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 


  • Modal.js
const IMG_API = 'https://cat-photos-dev-serverlessdeploymentbucket-fdpz0swy5qxq.s3.ap-northeast-2.amazonaws.com/public'

class Modal {
  data = {
    isVisible: false,
    path: ''
  }

  constructor({ $target }) {
    const $modal = document.createElement('div')
    $modal.className = 'Modal ImageViewer'
    this.$modal = $modal
    this.$modal.style.display = 'none'
    $target.appendChild(this.$modal)
  }

  hideModal() {
    this.$modal.style.display = 'none'
    this.$modal.innerHTML = ``
    this.setState({
      isVisible: false,
      path: ''
    })
  }

  setState(newData) {
    this.data = newData
    this.render()
  }

  render() {
    if(this.data.isVisible) {
      this.$modal.style.display = 'block'
      this.$modal.innerHTML = `
        <div class="content">
          <img src="${IMG_API}${this.data.path}">
        </div>
      `

      document.addEventListener('keydown', e => {
        if(e.key === 'Escape') this.hideModal()
      })

      document.addEventListener('click', e => {
        if(e.target.className === 'Modal ImageViewer') this.hideModal()
      })
    } else {
      this.$modal.innerHTML = ``
    }
  }
}

export default Modal

 

๋ชจ๋‹ฌ์ฐฝ ๋งŒ๋“œ๋Š” ๊ฑด ์ด์ „ ๊ณผ์ œ์—์„œ ๋งŽ์ด ๊ตฌํ˜„์„ ํ•ด๋ณด์•„์„œ ์ˆ˜์›”ํ–ˆ๋‹ค.

display: 'none'์œผ๋กœ ๋ชจ๋‹ฌ์ฐฝ์„ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ๋ณด์—ฌ์ฃผ๊ฒŒ๋” ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

 

 


 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œ

  • Lv2) ๋””ํŽœ์Šค ๊ฒŒ์ž„
๋ฌธ์ œ ์„ค๋ช…
์ค€ํ˜ธ๋Š” ์š”์ฆ˜ ๋””ํŽœ์Šค ๊ฒŒ์ž„์— ํ‘น ๋น ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””ํŽœ์Šค ๊ฒŒ์ž„์€ ์ค€ํ˜ธ๊ฐ€ ๋ณด์œ ํ•œ ๋ณ‘์‚ฌ n๋ช…์œผ๋กœ ์—ฐ์†๋˜๋Š” ์ ์˜ ๊ณต๊ฒฉ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ง‰๋Š” ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ๋””ํŽœ์Šค ๊ฒŒ์ž„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

โ–ช๏ธ ์ค€ํ˜ธ๋Š” ์ฒ˜์Œ์— ๋ณ‘์‚ฌ n๋ช…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
โ–ช๏ธ ๋งค ๋ผ์šด๋“œ๋งˆ๋‹ค enemy[i]๋งˆ๋ฆฌ์˜ ์ ์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.
โ–ช๏ธ ๋‚จ์€ ๋ณ‘์‚ฌ ์ค‘ enemy[i]๋ช… ๋งŒํผ ์†Œ๋ชจํ•˜์—ฌ enemy[i]๋งˆ๋ฆฌ์˜ ์ ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(โ–ซ๏ธ ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚จ์€ ๋ณ‘์‚ฌ๊ฐ€ 7๋ช…์ด๊ณ , ์ ์˜ ์ˆ˜๊ฐ€ 2๋งˆ๋ฆฌ์ธ ๊ฒฝ์šฐ, ํ˜„์žฌ ๋ผ์šด๋“œ๋ฅผ ๋ง‰์œผ๋ฉด 7 - 2 = 5๋ช…์˜ ๋ณ‘์‚ฌ๊ฐ€ ๋‚จ์Šต๋‹ˆ๋‹ค.
โ–ซ๏ธ ๋‚จ์€ ๋ณ‘์‚ฌ์˜ ์ˆ˜๋ณด๋‹ค ํ˜„์žฌ ๋ผ์šด๋“œ์˜ ์ ์˜ ์ˆ˜๊ฐ€ ๋” ๋งŽ์œผ๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.)
โ–ช๏ธ ๊ฒŒ์ž„์—๋Š” ๋ฌด์ ๊ถŒ์ด๋ผ๋Š” ์Šคํ‚ฌ์ด ์žˆ์œผ๋ฉฐ, ๋ฌด์ ๊ถŒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ‘์‚ฌ์˜ ์†Œ๋ชจ์—†์ด ํ•œ ๋ผ์šด๋“œ์˜ ๊ณต๊ฒฉ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ–ช๏ธ ๋ฌด์ ๊ถŒ์€ ์ตœ๋Œ€ k๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค€ํ˜ธ๋Š” ๋ฌด์ ๊ถŒ์„ ์ ์ ˆํ•œ ์‹œ๊ธฐ์— ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ผ์šด๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ค€ํ˜ธ๊ฐ€ ์ฒ˜์Œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณ‘์‚ฌ์˜ ์ˆ˜ n, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฌด์ ๊ถŒ์˜ ํšŸ์ˆ˜ k, ๋งค ๋ผ์šด๋“œ๋งˆ๋‹ค ๊ณต๊ฒฉํ•ด์˜ค๋Š” ์ ์˜ ์ˆ˜๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋‹ด๊ธด ์ •์ˆ˜ ๋ฐฐ์—ด enemy๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ค€ํ˜ธ๊ฐ€ ๋ช‡ ๋ผ์šด๋“œ๊นŒ์ง€ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š”์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ
โ˜‘๏ธ 1 ≤ n ≤ 1,000,000,000
โ˜‘๏ธ 1 ≤ k ≤ 500,000
โ˜‘๏ธ 1 ≤ enemy์˜ ๊ธธ์ด ≤ 1,000,000
โ˜‘๏ธ 1 ≤ enemy[i] ≤ 1,000,000
โ˜‘๏ธ enemy[i]์—๋Š” i + 1 ๋ผ์šด๋“œ์—์„œ ๊ณต๊ฒฉํ•ด์˜ค๋Š” ์ ์˜ ์ˆ˜๊ฐ€ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.
โ˜‘๏ธ ๋ชจ๋“  ๋ผ์šด๋“œ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” enemy[i]์˜ ๊ธธ์ด๋ฅผ return ํ•ด์ฃผ์„ธ์š”.

์ž…์ถœ๋ ฅ ์˜ˆ
n: 7 / k: 3 / enemy: [4, 2, 4, 5, 3, 3, 1] / result: 5
n: 2 / k: 4 / enemy: [3, 3, 3, 3] / result: 4

 

๋‚ด๊ฐ€ ํ‘ผ ์ฝ”๋“œ

function solution(n, k, enemy) {
  let answer = 0
  let heap = [null]
  const TOTAL_ROUND = enemy.length

  if (k >= TOTAL_ROUND) return TOTAL_ROUND
  if (n >= enemy.reduce((sum, num) => (sum += num), 0)) return TOTAL_ROUND

  // ํž™ ๊ตฌํ˜„
  const swap = (a, b) => {
    return ([heap[a], heap[b]] = [heap[b], heap[a]])
  }

  const pushHeap = (enemy) => {
    heap.push(enemy)

    let i = heap.length - 1
    while (true) {
      const parentIdx = parseInt(i / 2)
      const parent = heap[parentIdx]
      if (parent && parent < heap[i]) {
        swap(i, parentIdx)
        i = parentIdx
      } else break
    }
  }

  const deleteHeap = () => {
    const target = heap[1]
    const lastValue = heap.pop()
    if (heap.length > 1) heap[1] = lastValue
    else return target

    let i = 1
    while (true) {
      const leftIdx = 2 * i
      const rightIdx = 2 * i + 1

      if (!heap[leftIdx]) break

      if (!heap[rightIdx]) {
        if (heap[leftIdx] > heap[i]) {
          swap(leftIdx, i)
          i = leftIdx
        } else break
      } else {
        if (heap[leftIdx] >= heap[rightIdx]) {
          if (heap[leftIdx] > heap[i]) {
            swap(leftIdx, i)
            i = leftIdx
          } else break
        } else {
          if (heap[rightIdx] > heap[i]) {
            swap(rightIdx, i)
            i = rightIdx
          } else break
        }
      }
    }
    return target
  }

  for (let i = 0; i < TOTAL_ROUND; i++) {
    n -= enemy[i]
    pushHeap(enemy[i])
    if (n < 0) {
      if (k > 0) {
        const deletedValue = deleteHeap()
        k--
        n += deletedValue
      } else return (answer = i)
    }
  }

  if (!answer) answer = TOTAL_ROUND

  return answer
}

 

๋””ํŽœ์Šค ๊ฒŒ์ž„์€ ์ž‘๋…„์— ํ’€์–ด๋ณธ ์ ์ด ์žˆ์—ˆ๋˜ ๋ฌธ์ œ์˜€๋”ฐ.

์šฐ์„ ์ˆœ์œ„ ํž™์œผ๋กœ ํ’€์—ˆ์—ˆ๋Š”๋ฐ ๋‹ค์‹œ ํ’€๋ผ๋‹ˆ๊นŒ ๊ธฐ์–ต์ด ์•ˆ๋‚˜์„œ ๋‚ด๊ฐ€ ํ‘ผ ์ฝ”๋“œ ์ฐธ๊ณ ํ•ด์„œ ๋‹ค์‹œ ํ’€์–ด๋ดค๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ์šฐ์„ ์ˆœ์œ„ ํž™ ํ•จ์ˆ˜๊ฐ€ ์—†์–ด์„œ ์ง์ ‘ ๊ตฌํ˜„์„ ํ•ด์•ผํ•ด์„œ Lv2์ง€๋งŒ ์กฐ๊ธˆ ๋” ์–ด๋ ต๊ฒŒ ๋А๊ปด์กŒ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ณ‘์‚ฌ n์œผ๋กœ ์ ์ธ enemy๋ฅผ ๋ฌผ๋ฆฌ์น˜๋‹ค๊ฐ€ n์œผ๋กœ ๋ฌผ๋ฆฌ์น  ์ˆ˜ ์—†๋Š” ์‹œ๊ธฐ๊ฐ€ ์˜ค๋ฉด ๋ฌด์ ๊ถŒ์ธ k๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์šฐ์„ ์ˆœ์œ„ ํž™์— ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ (heap[1])์„ k๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

heap[1]์— ๊ฐ€์žฅ ํฐ ์ˆ˜๊ฐ€ ์˜ค๊ธฐ ์œ„ํ•ด swap๊ณผ์ •์„ ๊ฑฐ์ณ์คฌ๋‹ค.

 

 

 

 

๋งˆ๋ฌด๋ฆฌ


๋ฐฉํ•™์ด์—ˆ์ง€๋งŒ ๋ฐ€๋ฆฐ ๊ณต๋ถ€๋ฅผ ๋๋‚ด๊ธฐ ์œ„ํ•ด ์นดํŽ˜๊ฐ€์„œ ์—ด์‹ฌํžˆ ๊ณผ์ œ ํ…Œ์ŠคํŠธ๋ฅผ ํ’€์—ˆ๋‹ค. ๋ฟŒ๋“ฏํ•˜๋‹ค ๐Ÿคจ

๋‹ค์Œ ์ฃผ์—๋Š” Figma ์ˆ˜์—…์ธ๋ฐ ๊ทธ ์ „๊นŒ์ง€ ๋‚จ์€ JS๊ฐ•์˜ ๋‹ค ๋“ค์–ด์•ผ์ง€ ํ›„,,