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

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

๊ฐ€์šค์ด 2024. 1. 24. 23:17

Intro


์˜ค๋Š˜์€ ๊ฐ•์˜๋Š” ์•ˆ๋“ฃ๊ณ  ํ…Œ์ŠคํŠธ๋งŒ ํ’€์—ˆ๋‹ค.

4์‹œ๊ฐ„์งœ๋ฆฌ ๊ณผ์ œํ…Œ์ŠคํŠธ๋งŒ ํ’€์–ด๋„ ํž˜๋“ค๋‹ค. ์ž๊ธฐ ์ „์— ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋„ 3๋ฌธ์ œ ํ’€์—ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋ฌธ์ œ lv2 ํ’€๋ ค๋‹ค๊ฐ€ ํž˜๋“ค์–ด์„œ ๋‚ด์ผ๋กœ ๋ฏธ๋ค˜๋‹ค ใ…Žใ…Ž

 

 

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

: ๊ณผ์ œํ…Œ์ŠคํŠธ์™€ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ํ’€์–ด๋ณด๊ธฐ


 

์ดํ‹€ ์ „์— ํ’€์—ˆ๋˜ ๊ณ ์–‘์ด ๋ฌธ์ œ์™€ ์กฐ๊ธˆ ๋‹ค๋ฅธ.. ๊ณ ์–‘์ด ์‚ฌ์ง„ ๊ฒ€์ƒ‰๊ธฐ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค. ์ง€๋‚œ ๋ฌธ์ œ๋“ค๊ณผ ๋น„์Šทํ•œ ๊ตฌํ˜„ ๋ฌธ์ œ๋„ ์žˆ์—ˆ๊ณ  ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋„ ์žˆ์—ˆ๋‹ค. ์ด๋ฒˆ ๋ฌธ์ œ์—์„  index.html์— ๊ตฌํ˜„๋œ ์š”์†Œ๋“ค์„ ์ปดํฌ๋„ŒํŠธํ™”ํ•˜๋Š” ์ž‘์—…๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์ƒˆ๋กญ๊ฒŒ ํ’€์–ด ๋ณธ ๋ฌธ์ œ๋“ค๋งŒ ๋ฆฌ๋ทฐํ•ด๋ณด์•˜๋‹ค.

 


 

๊ฒ€์ƒ‰์–ด ์ถ”์ฒœ

[ํ•„์ˆ˜] ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด API๋ฅผ ์ด์šฉํ•ด ์ž…๋ ฅ๋ž€์— ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ณด์—ฌ์ฃผ์„ธ์š”. ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด๋Š” ์—”ํ„ฐ๋ฅผ ์น˜๋Š” ๋“ฑ ๋ณ„๋„์˜ ํ–‰์œ„๊ฐ€ ์—†์„ ๋•Œ์—๋„ ์ž๋™์œผ๋กœ ๋ณด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โœ… keywords๋ผ๋Š” class ๋ช…์œผ๋กœ ์Šคํƒ€์ผ๋ง ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ index.html๊ณผ style.css๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
โœ… API์— ๋Œ€ํ•œ ์„ค๋ช…์€ ํ•˜๋‹จ์— ์žˆ์Šต๋‹ˆ๋‹ค.
โœ… API์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฑฐ๋‚˜, ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฒ€์ƒ‰์–ด ์ถ”์ฒœ - ์‚ฌ์šฉ์„ฑ ๊ฐœ์„ 
ํ‚ค๋ณด๋“œ์™€ ๋งˆ์šฐ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ์„ธ์š”.
1๏ธโƒฃ esc๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด ์ฐฝ์ด ๋‹ซํž™๋‹ˆ๋‹ค.
2๏ธโƒฃ ํ‚ค๋ณด๋“œ์˜ ์œ„, ์•„๋ž˜ ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด ํ•˜์ด๋ผ์ดํŠธ๊ฐ€ ์˜ฎ๊ฒจ์ง€๊ณ  ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ•˜์ด๋ผ์ดํŠธ๊ฐ€ ์œ„์น˜ํ•œ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์ž…๋ ฅ์ฐฝ์— ๋ฐ˜์˜๋˜๊ณ  ์‚ฌ์ง„์ด ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค.
3๏ธโƒฃ ๋งˆ์šฐ์Šค๋กœ ๋‹ค๋ฅธ ๊ณณ์„ ํด๋ฆญํ•˜์—ฌ input์ด focus๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด ์ฐฝ์ด ๋‹ซํž™๋‹ˆ๋‹ค.
4๏ธโƒฃ ๋งˆ์šฐ์Šค๋กœ ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•œ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์ž…๋ ฅ์ฐฝ์— ๋ฐ˜์˜๋˜๋ฉฐ ์‚ฌ์ง„์ด ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค.  

 

์œ„์˜ ๋ฌธ์ œ์—์„œ ํ•„์ˆ˜ ๊ตฌํ˜„๊ณผ 1, 3, 4๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

2๋ฒˆ์€ ๋ชป ํ’€์—ˆ๋‹ค. ํ’€์–ด๋ณด๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์‹œ๊ฐ„ ๋ถ€์กฑ + ํ’€๋‹ค๊ฐ€ ๋ง‰ํ˜€์„œ ํฌ๊ธฐ.. ใ…  ํ•ด์„ค ๊ฐ•์˜ ๋“ค์–ด๋ด์•ผ๊ฒ ๋‹ค.

  • Keywords.js
class Keywords {
  data = {
    items: [],
  }

  constructor({ $target, onSelectKeyword }) {
    this.$keywordsContainer = document.createElement('div')
    this.$keywordsContainer.className = 'keywords'

    this.$keywordsList = document.createElement('ul')
    this.$keywordsContainer.appendChild(this.$keywordsList)
    $target.appendChild(this.$keywordsContainer)

    this.onSelectKeyword = onSelectKeyword
  }

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

  showKeywordList() {
    this.$keywordsContainer.style.display = 'block'
  }

  hideKeywordList() {
    this.$keywordsContainer.style.display = 'none'
  }

  render() {
    if(this.data.items) {
      this.$keywordsList.innerHTML = this.data.items.map(item => `
        <li class='keywordItem'>${item}</li>
      `).join('')
      this.showKeywordList()

      // 4. ๋งˆ์šฐ์Šค๋กœ ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•œ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์ž…๋ ฅ์ฐฝ์— ๋ฐ˜์˜๋˜๋ฉฐ ์‚ฌ์ง„์ด ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค.
      this.$keywordsList.querySelectorAll('.keywordItem').forEach($item => {
        $item.addEventListener('click', e => {
            this.onSelectKeyword(e.target.textContent)
        })
      })

      // 1. esc๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด ์ฐฝ์ด ๋‹ซํž™๋‹ˆ๋‹ค.
      document.addEventListener('keydown', e => {
        if(e.key === 'Escape') {
          this.hideKeywordList()
        }
      })

      // 3. ๋งˆ์šฐ์Šค๋กœ ๋‹ค๋ฅธ ๊ณณ์„ ํด๋ฆญํ•˜์—ฌ input์ด focus๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด ์ฐฝ์ด ๋‹ซํž™๋‹ˆ๋‹ค.
      document.addEventListener('click', e => {
        if(e.target.className !== 'keyword') this.hideKeywordList()
      })    
    } else {
      this.$keywordsList.innerHTML = ``
      this.hideKeywordList()
    }
  }
}

export default Keywords
  • App.js
...

this.header = new Header({ $target ...

// 4. ๋งˆ์šฐ์Šค๋กœ ์ถ”์ฒœ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•œ ๊ฒ€์ƒ‰์–ด๊ฐ€ ์ž…๋ ฅ์ฐฝ์— ๋ฐ˜์˜๋˜๋ฉฐ ์‚ฌ์ง„์ด ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค.  
this.keywords = new Keywords({ $target, onSelectKeyword: keyword => {
  this.header.setState({ searchValue: keyword })
} })

...

 

Header ์ปดํฌ๋„ŒํŠธ์— ํ‚ค์›Œ๋“œ ๊ฐ’์„ ์ „๋‹ฌํ•ด ํด๋ฆญํ–ˆ์„ ๊ฒฝ์šฐ, input value ๊ฐ’์„ ํ‚ค์›Œ๋“œ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  value ๊ฐ’์œผ๋กœ ์กฐํšŒํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

 


๊ฒ€์ƒ‰

๊ฒ€์ƒ‰์ด ์ผ์–ด๋‚˜๋ฉด url ๋’ค์— ?q={๊ฒ€์ƒ‰์–ด}๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค.
โš ๏ธ ํŽ˜์ด์ง€ url์— ๊ฒ€์ƒ‰์–ด๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํŽ˜์ด์ง€์— ์ง„์ž…ํ•˜์ž๋งˆ์ž ํ•ด๋‹น ๊ฒ€์ƒ‰์–ด๋กœ ๊ฒ€์ƒ‰๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

  • App.js
constructor() {
  this.header = new Header({ $target, onSearch: keyword => {
    this.loading.show()
    api.fetchCats(keyword).then(({ data }) => {
      if(data) this.setState({
        items: data
      })
    })
  
    // URL queryString update
    this.setSearchParams(keyword)
    this.loading.hide()
  }, 

...

}

 

setSearchParams ํ•จ์ˆ˜

setSearchParams(keyword) {
  const url = new URL(window.location);
  url.searchParams.set('q', keyword);
  window.history.pushState({}, '', url);
}

 

ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ์šฐ url์„ ์žฌ๋กœ๋”ฉ ์—†์ด ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

์ œ๋Œ€๋กœ ํ•œ๊ฑด์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค ใ…Žใ…Ž

 

  • App.js
...

// URL params
if(location.search) {
  const urlSearchParams = new URLSearchParams(location.search)
  const searchKeyword = urlSearchParams.get('q')
  if(searchKeyword) {
    this.header.setState({ searchValue: searchKeyword })
  }
}

...

 

ํŽ˜์ด์ง€ ์ง„์ž… ์‹œ url์— ๊ฒ€์ƒ‰์–ด๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฒ€์ƒ‰์–ด๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

 


๐Ÿ‘ฉ‍๐Ÿ’ป ๊ณผ์ œ ํ…Œ์ŠคํŠธ ํ›„๊ธฐ

์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์ด ์ ์  ์ถ”๊ฐ€๋˜๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ ธ ์ข€ ์–ด๋ ค์› ๋‹ค. ๐Ÿ˜ญ

๊ทธ๋ž˜๋„ [ํ•„์ˆ˜] ๋ฌธ์ œ๋Š” ๋‹ค ํ’€์—ˆ๋‹ค. ๊ทธ๊ฑธ๋กœ ์ผ๋‹จ ๋งŒ์กฑ...

์ฃผ๋ง์— ๋‹ค์‹œ ์ฐจ๊ทผ์ฐจ๊ทผ ํ’€์–ด๋ด์•ผ๊ฒ ๋‹ค.

 

 

 

 


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

  • Lv0) ๋ฌธ์ž ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
๋ฌธ์ œ ์„ค๋ช…
์•ŒํŒŒ๋ฒณ ๋Œ€์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด my_string์ด ์ฃผ์–ด์งˆ ๋•Œ, my_string์—์„œ 'A'์˜ ๊ฐœ์ˆ˜, my_string์—์„œ 'B'์˜ ๊ฐœ์ˆ˜,..., my_string์—์„œ 'Z'์˜ ๊ฐœ์ˆ˜, my_string์—์„œ 'a'์˜ ๊ฐœ์ˆ˜, my_string์—์„œ 'b'์˜ ๊ฐœ์ˆ˜,..., my_string์—์„œ 'z'์˜ ๊ฐœ์ˆ˜๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋‹ด์€ ๊ธธ์ด 52์˜ ์ •์ˆ˜ ๋ฐฐ์—ด์„ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ
โš ๏ธ  1 ≤ my_string์˜ ๊ธธ์ด ≤ 1,000

์ž…์ถœ๋ ฅ ์˜ˆ
my_string: "Programmers"
result: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0]

 

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

function solution(my_string) {
    let answer = []
    const upperStr = new Array(26).fill(0)
    const lowerStr = new Array(26).fill(0)
    const MY_STR_LEN = my_string.length
    
    // A-Z: 65-90 (26๊ฐœ), a-z: 97-122 (26๊ฐœ)
    for(let i=0; i<MY_STR_LEN; i++) {
        const code = my_string[i].charCodeAt()
        code <= 90 ? upperStr[code-65]++ : lowerStr[code-97]++
    }
    
    answer = [...upperStr, ...lowerStr]
    return answer
}

 

๋ฌธ์ž๋ฅผ ์•„์Šคํ‚ค ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” charCodeAt() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ’€์–ด๋ณด์•˜๋‹ค.

A-Z๊นŒ์ง€ 65-90์ด๊ณ , a-z๋Š” 97-122๋ผ์„œ ์ˆซ์ž๊ฐ€ ์ญ‰ ์ด์–ด์ ธ ๋‚˜์—ด๋๋‹ค๋ฉด ๋ฐ”๋กœ ์ธ๋ฑ์Šค ์ฐพ์•„์„œ ๋„ฃ์—ˆ์„ํ…๋ฐ.. 91-96์ด ๋น„์–ด์„œ ใ…  ์†Œ๋ฌธ์ž์ธ์ง€ ๋Œ€๋ฌธ์ž์ธ์ง€ ์ฐพ์•„์„œ ๋”ฐ๋กœ ๋„ฃ์–ด์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•ด ๋ฐฐ์—ด์„ ๋‘๊ฐœ ์ƒ์„ฑํ–ˆ๋‹ค.

๋ณ€ํ™˜ํ•œ ์ฝ”๋“œ๊ฐ’์ด 90์ดํ•˜๋ฉด ๋Œ€๋ฌธ์ž์— code-65ํ•œ ๋ฐฐ์—ด index๋ฅผ ์ฐพ์•„์„œ +1ํ•˜๊ณ  ์†Œ๋ฌธ์ž๋ฉด code-97ํ•œ ๋ฐฐ์—ด index๋ฅผ ์ฐพ์•„ +1์„ ํ•ด์คฌ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— ...์—ฐ์‚ฐ์ž๋กœ ๋‘ ๋ฐฐ์—ด์„ ํ•ฉ์ณ์„œ ๋ฆฌํ„ดํ•ด์ฃผ์—ˆ๋‹ค.

 

 

  • Lv0) ์ด์–ด ๋ถ™์ธ ์ˆ˜
๋ฌธ์ œ ์„ค๋ช…
์ •์ˆ˜๊ฐ€ ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ num_list๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. num_list์˜ ํ™€์ˆ˜๋งŒ ์ˆœ์„œ๋Œ€๋กœ ์ด์–ด ๋ถ™์ธ ์ˆ˜์™€ ์ง์ˆ˜๋งŒ ์ˆœ์„œ๋Œ€๋กœ ์ด์–ด ๋ถ™์ธ ์ˆ˜์˜ ํ•ฉ์„ returnํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ
โš ๏ธ 2 ≤ num_list์˜ ๊ธธ์ด ≤ 10
โš ๏ธ 1 ≤ num_list์˜ ์›์†Œ ≤ 9
โš ๏ธ num_list์—๋Š” ์ ์–ด๋„ ํ•œ ๊ฐœ์”ฉ์˜ ์ง์ˆ˜์™€ ํ™€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ
#1. num_list: [3, 4, 5, 2, 1] / result: 393
#2. num_list: [5, 7, 8, 3] / result: 581

 

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

function solution(num_list) {
    let answer = 0
    let even = ''
    let odd = ''
    
    num_list.forEach(num => {
        num%2 ? even += num.toString() : odd += num.toString()
    })
    
    answer = Number(even) + Number(odd)
    return answer
}

 

num_list๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ง์ˆ˜์ธ์ง€ ํ™€์ˆ˜์ธ์ง€ ํŒ๋‹จํ•œ ํ›„, ์ง์ˆ˜๋ฉด ์ˆซ์ž๊ฐ’์„ even์— ๋ฌธ์ž์—ด๋กœ ์ด์–ด ๋ถ™์—ฌ์ฃผ๊ณ  ํ™€์ˆ˜๋ฉด odd์— ์ด์–ด ๋ถ™์—ฌ์คฌ๋‹ค.

๊ทธ๋ฆฌ๊ณ  even๊ณผ odd์˜ ๊ฐ’์„ Number๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ๋”ํ•ด์ฃผ์—ˆ๋‹ค.

 

  • Lv1) ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด
๋ฌธ์ œ ์„ค๋ช…
์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด t์™€ p๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, t์—์„œ p์™€ ๊ธธ์ด๊ฐ€ ๊ฐ™์€ ๋ถ€๋ถ„๋ฌธ์ž์—ด ์ค‘์—์„œ, ์ด ๋ถ€๋ถ„๋ฌธ์ž์—ด์ด ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜๊ฐ€ p๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒƒ์ด ๋‚˜์˜ค๋Š” ํšŸ์ˆ˜๋ฅผ returnํ•˜๋Š” ํ•จ์ˆ˜ solution์„ ์™„์„ฑํ•˜์„ธ์š”.
์˜ˆ๋ฅผ ๋“ค์–ด, t="3141592"์ด๊ณ  p="271" ์ธ ๊ฒฝ์šฐ, t์˜ ๊ธธ์ด๊ฐ€ 3์ธ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์€ 314, 141, 415, 159, 592์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ž์—ด์ด ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜ ์ค‘ 271๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜๋Š” 141, 159 2๊ฐœ ์ž…๋‹ˆ๋‹ค.

์ œํ•œ์‚ฌํ•ญ
โš ๏ธ 1 ≤ p์˜ ๊ธธ์ด ≤ 18
โš ๏ธ p์˜ ๊ธธ์ด ≤ t์˜ ๊ธธ์ด ≤ 10,000
โš ๏ธ t์™€ p๋Š” ์ˆซ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ด๋ฉฐ, 0์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ
#1. t: "3141592" / p: "271" / result: 2
#2. t: "500220839878" / p: "7" / result: 8
#3. t: "10203" / p: "15" / result: 3

 

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

function solution(t, p) {
    let answer = 0
    const DIGIT = p.length
    const pNum = Number(p)
   
    for(let i=0; i<=t.length-DIGIT; i++) {
        const targetNum = Number(t.slice(i, i+DIGIT))
        if(targetNum <= pNum) answer++
    }
    
    return answer
}

 

p์™€ ์ž๋ฆฟ์ˆ˜๊ฐ€ ๊ฐ™๊ฒŒ t๋ฅผ ์ž˜๋ผ์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

t๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ slice๋ฅผ ์ด์šฉํ•ด์„œ ์ž๋ฆฟ์ˆ˜์— ๋งž๊ฒŒ ์ˆซ์ž๋ฅผ ์ž๋ฅธ ํ›„ p์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•ด์„œ p๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜์ผ ๊ฒฝ์šฐ answer์„ +1 ํ•ด์ฃผ์—ˆ๋‹ค.

 

 


๐Ÿ‘ฉ‍๐Ÿ’ป ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ํ›„๊ธฐ

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋Š” ๋ ˆ๋ฒจ 1๊นŒ์ง€๋งŒ ํ’€์—ˆ๋Š”๋ฐ ๊ธฐ์กด์— ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ’€์–ด์„œ 1๊นŒ์ง„ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๋ ˆ๋ฒจ 2๋ฌธ์ œ๋„ ๋งŽ์ด ํ’€์–ด๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธˆ๋ฐฉ ํ’€ ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ˜Š

์•”ํŠผ ์˜ค๋žœ๋งŒ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋‹ˆ ์žฌ๋ฐŒ๊ธฐ๋„ ํ•˜๊ณ  ๊พธ์ค€ํžˆ ํ’€๊ธฐ๋กœ ํ–ˆ์—ˆ๋Š”๋ฐ ๊ทธ๋™์•ˆ ๋ชปํ’€์–ด์„œ.. ๋‹ค์‹œ ๊พธ์ค€ํžˆ ํ’€์–ด๋ณด์•„์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

 

 

๋งˆ๋ฌด๋ฆฌ


๋‚ด์ผ๋ถ€ํ„ฐ ๋ฐฉํ•™์ธ๋ฐ ๋ฐฉํ•™์„ ์ œ๋Œ€๋กœ ์ฆ๊ธธ ์ˆœ ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.

์•„์ง ๋ฐ€๋ฆฐ ๊ณต๋ถ€๊ฐ€ ๋งŽ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ใ… ใ… 

๊ทธ๋ž˜๋„ ๋‹คํ–‰ํžˆ ์ดํ‹€์˜ ๋ฐฉํ•™์„ ์ฃผ์‹  ๋•์— ๋‹ค์Œ์ฃผ์— ๋“ค์–ด๊ฐ€๋Š” Figma ๊ฐ•์˜ ์ „๊นŒ์ง€ ๋ฐ€๋ฆฐ ๊ฐ•์˜๋Š” ๋‹ค ๋๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋‚ด์ผ๋„ ๋˜ ์—ด์‹ฌํžˆ ๋‹ฌ๋ฆฌ์ž