5κ°€μ§€ 일반적인 JavaScript λ©΄μ ‘ 과제: 뢄석 및 μ†”λ£¨μ…˜

5κ°€μ§€ 일반적인 JavaScript λ©΄μ ‘ 과제: 뢄석 및 μ†”λ£¨μ…˜

λ²ˆμ—­μž: 당신을 μœ„ν•œ 기사λ₯Ό κ²Œμ‹œν–ˆμŠ΅λ‹ˆλ‹€ 일반적인 JavaScript μž‘μ—…μ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜λŠ” Maria Antonietta Perna, 인터뷰 쀑에 개발자 μ§€μ›μžμ—κ²Œ κ°€μž₯ 자주 μ œκ³΅λ©λ‹ˆλ‹€. 이 κΈ°μ‚¬λŠ” μš°μ„  초보 ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€.

기술 νšŒμ‚¬μ˜ μΈν„°λ·°λŠ” μ˜€λž«λ™μ•ˆ ν™”μ œκ°€ λ˜μ–΄ μ™”μŠ΅λ‹ˆλ‹€. μ΄λŠ” λ†€λΌμš΄ 일이 μ•„λ‹™λ‹ˆλ‹€. μ„±κ³΅μ μœΌλ‘œ 인터뷰λ₯Ό ν†΅κ³Όν•˜λ©΄ 쒋은 직업을 얻을 수 μžˆλŠ” κΈ°νšŒκ°€ μ œκ³΅λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ³΅μž‘ν•œ 문제λ₯Ό ν•΄κ²°ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ 많기 λ•Œλ¬Έμ— μ΄λŠ” 그리 κ°„λ‹¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ˜ν•œ λŒ€λΆ€λΆ„μ˜ 경우 μ΄λŸ¬ν•œ μž‘μ—…μ˜ λŒ€λΆ€λΆ„μ€ μ§€μ›μžκ°€ μˆ˜ν–‰ν•  μž‘μ—…κ³Ό 관련이 μ—†μ§€λ§Œ μ—¬μ „νžˆ ν•΄κ²°ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ•Œλ‘œλŠ” Googleμ΄λ‚˜ λ‹€λ₯Έ μ†ŒμŠ€μ— ν™•μΈν•˜μ§€ μ•Šκ³  κ²Œμ‹œνŒμ—μ„œ 이λ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€. 예, 상황은 점차 λ³€ν•˜κ³  있으며 일뢀 νšŒμ‚¬μ—μ„œλŠ” μ΄λŸ¬ν•œ 인터뷰λ₯Ό ν¬κΈ°ν•˜κ³  μžˆμ§€λ§Œ λ§Žμ€ κ³ μš©μ£ΌλŠ” μ—¬μ „νžˆ μ΄λŸ¬ν•œ 전톡을 κ³ μˆ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 글은 ꡬ직자의 μž‘μ—…μœΌλ‘œ 자주 μ‚¬μš©λ˜λŠ” 일반적인 JavaScript μž‘μ—…μ— λŒ€ν•œ 뢄석을 λ‹€λ£Ήλ‹ˆλ‹€.

μ•Œλ¦Ό: "Habr"의 λͺ¨λ“  λ…μžλ₯Ό μœ„ν•œ - "Habr" ν”„λ‘œλͺ¨μ…˜ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ Skillbox 과정에 등둝할 λ•Œ 10 루블 할인.

SkillboxλŠ” λ‹€μŒμ„ ꢌμž₯ν•©λ‹ˆλ‹€. μ‹€κΈ° μ½”μŠ€ "λͺ¨λ°”일 개발자 PRO".

κ°€μž₯ μ€‘μš”ν•œ 것은 인터뷰λ₯Ό μ² μ €νžˆ μ€€λΉ„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

예, 업무λ₯Ό μ‚΄νŽ΄λ³΄κΈ° 전에 일반적인 λ©΄μ ‘ μ€€λΉ„ νŒμ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

κ°€μž₯ μ€‘μš”ν•œ 것은 미리 μ€€λΉ„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ•Œκ³ λ¦¬μ¦˜κ³Ό 데이터 ꡬ쑰λ₯Ό μ–Όλ§ˆλ‚˜ 잘 κΈ°μ–΅ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•˜κ³  μ΅μˆ™ν•˜μ§€ μ•Šμ€ μ˜μ—­μ— λŒ€ν•œ 지식을 ν–₯μƒμ‹œν‚€μ„Έμš”. 인터뷰 쀀비에 도움이 λ˜λŠ” 온라인 ν”Œλž«νΌμ΄ 많이 μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” μ‘°μ–Έν•©λ‹ˆλ‹€ 긱슀포긱슀, ν”„λž¨ν”„, 인터뷰.io ΠΈ μ½”λ“œ μ‹ ν˜Έ.

결정을 큰 μ†Œλ¦¬λ‘œ λ§ν•˜λŠ” 법을 λ°°μš°λŠ” 것은 κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‹¨μˆœνžˆ μΉ νŒμ— 글을 μ“°λŠ” 것(λ˜λŠ” 쑰용히 컴퓨터에 μ½”λ“œλ₯Ό μž…λ ₯ν•˜λŠ” 것)이 μ•„λ‹Œ μ§€μ›μžμ—κ²Œ μžμ‹ μ΄ ν•˜λŠ” 일에 λŒ€ν•΄ μ•Œλ €μ£ΌλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ μ½”λ“œμ— μ‹€μˆ˜κ°€ μžˆμ§€λ§Œ 일반적으둜 ν•΄κ²° 방법이 μ •ν™•ν•˜λ”λΌλ„ 성곡 κ°€λŠ₯성이 λ†’μ•„μ§‘λ‹ˆλ‹€.

문제 해결을 μ‹œμž‘ν•˜κΈ° 전에 문제λ₯Ό 이해해야 ν•©λ‹ˆλ‹€. μ–΄λ–€ κ²½μš°μ—λŠ” μž‘μ—…μ„ ν”Όμƒμ μœΌλ‘œ μ΄ν•΄ν•œ λ‹€μŒ 잘λͺ»λœ 길둜 갈 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ©΄μ ‘κ΄€μ—κ²Œ λͺ‡ κ°€μ§€ λͺ…ν™•ν•œ μ§ˆλ¬Έμ„ ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

PCκ°€ μ•„λ‹Œ μ†μœΌλ‘œ μ½”λ“œ μž‘μ„± μ—°μŠ΅μ„ ν•΄μ•Ό ν•©λ‹ˆλ‹€. 인터뷰 쀑에 μ§€μ›μžμ—κ²Œ νžŒνŠΈλ‚˜ μžλ™ μ„œμ‹μ΄ μ—†λŠ” λ§ˆμ»€μ™€ ν™”μ΄νŠΈλ³΄λ“œκ°€ μ œκ³΅λ˜λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. 해결책을 찾을 λ•Œ μ½”λ“œλ₯Ό μ’…μ΄λ‚˜ λ³΄λ“œμ— 직접 적어 λ‘λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λͺ¨λ“  것을 머릿속에 담아두면 μ€‘μš”ν•œ 것을 μžŠμ–΄λ²„λ¦΄ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

JavaScript의 ν…œν”Œλ¦Ώ μž‘μ—…

μ΄λŸ¬ν•œ μž‘μ—… 쀑 μΌλΆ€λŠ” 이미 μ΅μˆ™ν•  κ²ƒμž…λ‹ˆλ‹€. λΉ„μŠ·ν•œ 문제λ₯Ό ν•΄κ²°ν•΄μ•Ό ν•˜λŠ” 인터뷰λ₯Ό ν–ˆκ±°λ‚˜ JavaScriptλ₯Ό λ°°μš°λ©΄μ„œ μ—°μŠ΅ν•΄ λ³Έ 적이 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. 자, 이제 λ‹€μ‹œ 문제λ₯Ό ν•΄κ²°ν•˜κ³  과정에 λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…을 듀을 μ°¨λ‘€μž…λ‹ˆλ‹€.

회문

νšŒλ¬Έμ€ 일반적인 λ°©ν–₯κ³Ό λ°˜λŒ€ λ°©ν–₯ λͺ¨λ‘μ—μ„œ μ •ν™•νžˆ λ™μΌν•˜κ²Œ μ½νžˆλŠ” 단어, λ¬Έμž₯ λ˜λŠ” 문자 μ‹œν€€μŠ€μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, β€œAnnaβ€λŠ” νšŒλ¬Έμ΄μ§€λ§Œ β€œtable”과 β€œJohn”은 κ·Έλ ‡μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μŠ€ν…Œμ΄μ§•

λ¬Έμžμ—΄μ΄ μ£Όμ–΄μ§€λ©΄; λ¬Έμžμ—΄μ΄ 회문이면 trueλ₯Ό λ°˜ν™˜ν•˜κ³  κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ falseλ₯Ό λ°˜ν™˜ν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 경우 곡백과 ꡬ두점을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

palindrome('racecar') === μ°Έ
회문('ν…Œμ΄λΈ”') === κ±°μ§“

μž‘μ—…μ„ 뢄석해 λ΄…μ‹œλ‹€

μ—¬κΈ°μ„œ μ£Όμš” μ•„μ΄λ””μ–΄λŠ” λ¬Έμžμ—΄μ„ λ’€μ§‘λŠ” κ²ƒμž…λ‹ˆλ‹€. "μ—­λ°©ν–₯" λ¬Έμžμ—΄μ΄ μ›λž˜ λ¬Έμžμ—΄κ³Ό μ™„μ „νžˆ λ™μΌν•˜λ©΄ νšŒλ¬Έμ„ 받은 κ²ƒμ΄λ―€λ‘œ ν•¨μˆ˜λŠ” trueλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ·Έλ ‡μ§€ μ•Šλ‹€λ©΄ κ±°μ§“μž…λ‹ˆλ‹€.

κ²°μ •

λ‹€μŒμ€ νšŒλ¬Έμ„ ν•΄κ²°ν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€.

const palindrome = str => {
  // turn the string to lowercase
  str = str.toLowerCase()
  // reverse input string and return the result of the
  // comparisong
  return str === str.split('').reverse().join('')
}

첫 번째 λ‹¨κ³„λŠ” μž…λ ₯ λ¬Έμžμ—΄μ˜ 문자λ₯Ό μ†Œλ¬Έμžλ‘œ λ³€ν™˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” ν”„λ‘œκ·Έλž¨μ΄ λŒ€μ†Œλ¬Έμžλ‚˜ λ‹€λ₯Έ μ–΄λ–€ 것도 λΉ„κ΅ν•˜μ§€ μ•Šκ³  문자 자체λ₯Ό λΉ„κ΅ν•œλ‹€λŠ” 것을 보μž₯ν•©λ‹ˆλ‹€.

두 번째 λ‹¨κ³„λŠ” 라인을 λ’€μ§‘λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” μ–΄λ ΅μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. .split() λ©”μ„œλ“œ(λ¬Έμžμ—΄ 라이브러리)λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°°μ—΄λ‘œ λ³€ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ .reverse()(λ°°μ—΄ 라이브러리)λ₯Ό μ‚¬μš©ν•˜μ—¬ 배열을 λ’€μ§‘μŠ΅λ‹ˆλ‹€. λ§ˆμ§€λ§‰ λ‹¨κ³„λŠ” .join()(λ°°μ—΄ 라이브러리)을 μ‚¬μš©ν•˜μ—¬ μ—­λ°©ν–₯ 배열을 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

이제 ν•΄μ•Ό ν•  일은 "μ—­λ°©ν–₯" λ¬Έμžμ—΄μ„ μ›λž˜ λ¬Έμžμ—΄κ³Ό λΉ„κ΅ν•˜μ—¬ κ²°κ³Όκ°€ true λ˜λŠ” falseλ₯Ό λ°˜ν™˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

ν”Όμ¦ˆλ²„μ¦ˆ

μΈν„°λ·°μ—μ„œ κ°€μž₯ 인기 μžˆλŠ” μž‘μ—… 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

μŠ€ν…Œμ΄μ§•

1λΆ€ν„° nκΉŒμ§€μ˜ 숫자λ₯Ό μ½˜μ†”μ— μΈμ‡„ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ n은 λ‹€μŒ 쑰건에 따라 ν•¨μˆ˜κ°€ 맀개 λ³€μˆ˜λ‘œ μ‚¬μš©ν•˜λŠ” μ •μˆ˜μž…λ‹ˆλ‹€.

  • 3의 배수 λŒ€μ‹  fizzλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
  • 5의 배수인 숫자 λŒ€μ‹  λ²„μ¦ˆλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
  • 3κ³Ό 5의 배수인 숫자 λŒ€μ‹  fizzbuzzκ°€ 좜λ ₯λ©λ‹ˆλ‹€.

예

ν”Όμ¦ˆλ²„μ¦ˆ(5)

κ²°κ³Ό

// 1
// 2
// 탄산
// 4
//버저 μ†Œλ¦¬

μž‘μ—…μ„ 뢄석해 λ΄…μ‹œλ‹€

μ—¬κΈ°μ„œ κ°€μž₯ μ€‘μš”ν•œ 것은 JavaScriptλ₯Ό μ‚¬μš©ν•˜μ—¬ 배수λ₯Ό μ°ΎλŠ” λ°©λ²•μž…λ‹ˆλ‹€. λͺ¨λ“ˆλŸ¬μŠ€ μ—°μ‚°μž λ˜λŠ” λ‚˜λ¨Έμ§€ - %λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 두 숫자λ₯Ό λ‚˜λˆŒ λ•Œ λ‚˜λ¨Έμ§€λ₯Ό ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λ¨Έμ§€κ°€ 0이면 첫 번째 μˆ«μžκ°€ 두 번째 숫자의 λ°°μˆ˜λΌλŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

12% 5 // 2 -> 12λŠ” 5의 λ°°μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.
12% 3 // 0 -> 12λŠ” 3의 λ°°μˆ˜μž…λ‹ˆλ‹€.

λ”°λΌμ„œ 12λ₯Ό 5둜 λ‚˜λˆ„λ©΄ 2κ°€ 되고 λ‚˜λ¨Έμ§€λŠ” 2κ°€ λ©λ‹ˆλ‹€. 12λ₯Ό 3으둜 λ‚˜λˆ„λ©΄ 4κ°€ 되고 λ‚˜λ¨Έμ§€λŠ” 0이 λ©λ‹ˆλ‹€. 첫 번째 경우 12λŠ” 5의 λ°°μˆ˜κ°€ μ•„λ‹ˆκ³  두 번째 경우 , 12λŠ” 3의 λ°°μˆ˜μž…λ‹ˆλ‹€.

κ²°μ •

졜적의 μ†”λ£¨μ…˜μ€ λ‹€μŒ μ½”λ“œμž…λ‹ˆλ‹€.

const fizzBuzz = num => {
  for(let i = 1; i <= num; i++) {
    // check if the number is a multiple of 3 and 5
    if(i % 3 === 0 && i % 5 === 0) {
      console.log('fizzbuzz')
    } // check if the number is a multiple of 3
      else if(i % 3 === 0) {
      console.log('fizz')
    } // check if the number is a multiple of 5
      else if(i % 5 === 0) {
      console.log('buzz')
    } else {
      console.log(i)
    }
  }
}

이 ν•¨μˆ˜λŠ” 쑰건문을 μ‚¬μš©ν•˜μ—¬ ν•„μš”ν•œ 검사λ₯Ό μˆ˜ν–‰ν•˜κ³  μ‚¬μš©μžκ°€ μš”κ΅¬ν•˜λŠ” κ²°κ³Όλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. λ¬Έμ œμ—μ„œλŠ” if...else 문의 μˆœμ„œμ— μ£Όμ˜ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. 즉, 이쀑 쑰건(&&)으둜 μ‹œμž‘ν•˜κ³  μ—¬λŸ¬ 숫자λ₯Ό 찾을 수 μ—†λŠ” 경우둜 λλ‚©λ‹ˆλ‹€. 결과적으둜 μš°λ¦¬λŠ” λͺ¨λ“  μ˜΅μ…˜μ„ λ‹€λ£Ήλ‹ˆλ‹€.

철자 λ°”κΎΈκΈ°

μ΄λŠ” λ‹€λ₯Έ λ‹¨μ–΄μ˜ λͺ¨λ“  문자λ₯Ό 같은 숫자둜 ν¬ν•¨ν•˜μ§€λ§Œ μˆœμ„œκ°€ λ‹€λ₯Έ λ‹¨μ–΄μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.

μŠ€ν…Œμ΄μ§•

두 λ¬Έμžμ—΄μ΄ 철자 바꾸기인지, λŒ€μ†Œλ¬ΈμžλŠ” μ€‘μš”ν•˜μ§€ μ•Šμ€μ§€ ν™•μΈν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€. 문자만 κ³„μ‚°λ©λ‹ˆλ‹€. κ³΅λ°±μ΄λ‚˜ ꡬ두점은 κ³ λ €λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

anagram('finder', 'Friend') β€”> μ°Έ
anagram('hello', 'bye') β€”> κ±°μ§“

μž‘μ—…μ„ 뢄석해 λ΄…μ‹œλ‹€

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 두 μž…λ ₯μ€„μ˜ 각 λ¬Έμžμ™€ 각 μ€„μ˜ 숫자λ₯Ό 확인해야 ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

νŒŒμΈλ” β€”> f: 친ꡬ 1λͺ… β€”> f: 1
λ‚˜: 1 λ₯΄: 1
n: 1 λ‚˜: 1
d: 1 μ „μž: 1
μ „μž: 1 n: 1
r: 1 d: 1

철자 λ°”κΎΈκΈ° 데이터λ₯Ό μ €μž₯ν•˜λ €λ©΄ JavaScript 개체 λ¦¬ν„°λŸ΄κ³Ό 같은 ꡬ쑰λ₯Ό 선택해야 ν•©λ‹ˆλ‹€. 이 경우 핡심은 문자의 문자이고 값은 ν˜„μž¬ μ€„μ—μ„œ λ°˜λ³΅λ˜λŠ” νšŸμˆ˜μž…λ‹ˆλ‹€.

λ‹€λ₯Έ 쑰건이 μžˆμŠ΅λ‹ˆλ‹€:

  • 비ꡐ할 λ•Œ 문자의 λŒ€/μ†Œλ¬Έμžκ°€ κ³ λ €λ˜μ§€ μ•ŠλŠ”μ§€ 확인해야 ν•©λ‹ˆλ‹€. κ°„λ‹¨νžˆ 두 λ¬Έμžμ—΄μ„ λͺ¨λ‘ μ†Œλ¬Έμž λ˜λŠ” λŒ€λ¬Έμžλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
  • λΉ„κ΅μ—μ„œ λ¬Έμžκ°€ μ•„λ‹Œ λͺ¨λ“  ν•­λͺ©μ„ μ œμ™Έν•©λ‹ˆλ‹€. ν•¨κ»˜ μž‘μ—…ν•˜λŠ” 것이 κ°€μž₯ μ’‹μŠ΅λ‹ˆλ‹€. μ •κ·œ ν‘œν˜„μ‹.

κ²°μ •

// helper function that builds the
// object to store the data
const buildCharObject = str => {
  const charObj = {}
  for(let char of str.replace(/[^w]/g).toLowerCase()) {
    // if the object has already a key value pair
    // equal to the value being looped over,
    // increase the value by 1, otherwise add
    // the letter being looped over as key and 1 as its value
    charObj[char] = charObj[char] + 1 || 1
  }
  return charObj
}
 
// main function
const anagram = (strA, strB) => {
  // build the object that holds strA data
  const aCharObject = buildCharObject(strA)
  // build the object that holds strB data
  const bCharObject = buildCharObject(strB)
 
  // compare number of keys in the two objects
  // (anagrams must have the same number of letters)
  if(Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
    return false
  }
  // if both objects have the same number of keys
  // we can be sure that at least both strings
  // have the same number of characters
  // now we can compare the two objects to see if both
  // have the same letters in the same amount
  for(let char in aCharObject) {
    if(aCharObject[char] !== bCharObject[char]) {
      return false
    }
  }
  // if both the above checks succeed,
  // you have an anagram: return true
  return true
}

μ‚¬μš©μ— 주의 Object.keys () μœ„μ˜ μ‘°κ°μ—μ„œ. 이 λ©”μ†Œλ“œλŠ” 객체에 λ‚˜νƒ€λ‚˜λŠ” 것과 λ™μΌν•œ μˆœμ„œλ‘œ μ΄λ¦„μ΄λ‚˜ ν‚€λ₯Ό ν¬ν•¨ν•˜λŠ” 배열을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 이 경우 배열은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

['f', 'i', 'n', 'd', 'e', ​​​​'r']

μ΄λ ‡κ²Œ ν•˜λ©΄ λŒ€λŸ‰ 루프λ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•Šκ³ λ„ 객체의 속성을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. λ¬Έμ œκ°€ μžˆλŠ” 경우 .length 속성과 ν•¨κ»˜ 이 방법을 μ‚¬μš©ν•˜μ—¬ 두 λ¬Έμžμ—΄μ˜ 문자 μˆ˜κ°€ λ™μΌν•œμ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 철자 λ°”κΎΈκΈ°μ˜ μ€‘μš”ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€.

λͺ¨μŒ 검색

μΈν„°λ·°μ—μ„œ 자주 λ“±μž₯ν•˜λŠ” 맀우 κ°„λ‹¨ν•œ μž‘μ—…μž…λ‹ˆλ‹€.

μŠ€ν…Œμ΄μ§•

λ¬Έμžμ—΄μ„ 인수둜 μ‚¬μš©ν•˜κ³  λ¬Έμžμ—΄μ— ν¬ν•¨λœ λͺ¨μŒ 수λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.
λͺ¨μŒμ€ "a", "e", "i", "o", "u"μž…λ‹ˆλ‹€.

예 :

findVowels('hello') // β€”> 2
findVowels('이유') // β€”> 0

κ²°μ •

κ°€μž₯ κ°„λ‹¨ν•œ μ˜΅μ…˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

const findVowels = str => {
  let count = 0
  const vowels = ['a', 'e', 'i', 'o', 'u']
  for(let char of str.toLowerCase()) {
    if(vowels.includes(char)) {
      count++
    }
  }
  return count
}

.includes() λ©”μ†Œλ“œ μ‚¬μš©μ— μ£Όμ˜ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. λ¬Έμžμ—΄κ³Ό λ°°μ—΄ λͺ¨λ‘μ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 배열에 νŠΉμ • 값이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” 데 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” 배열에 μ§€μ •λœ 값이 ν¬ν•¨λ˜μ–΄ 있으면 trueλ₯Ό λ°˜ν™˜ν•˜κ³ , κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ¬Έμ œμ— λŒ€ν•œ 더 짧은 해결책이 μžˆμŠ΅λ‹ˆλ‹€.

const findVowels = str => {
  const matched = str.match(/[aeiou]/gi)
  return matched ? matches.length : 0
}

μ΄λŠ” 효율적인 검색을 κ΅¬ν˜„ν•  수 μžˆλŠ” .match() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λ©”μ„œλ“œ 인수인 μ •κ·œμ‹μ΄ μ§€μ •λœ λ¬Έμžμ—΄ λ‚΄μ—μ„œ 발견되면 λ°˜ν™˜ 값은 μΌμΉ˜ν•˜λŠ” 문자의 λ°°μ—΄μž…λ‹ˆλ‹€. μΌμΉ˜ν•˜λŠ” ν•­λͺ©μ΄ μ—†μœΌλ©΄ .match()λŠ” null을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

ν”Όλ³΄λ‚˜μΉ˜

λ‹€μ–‘ν•œ μˆ˜μ€€μ˜ μΈν„°λ·°μ—μ„œ 찾을 수 μžˆλŠ” 고전적인 μž‘μ—…μž…λ‹ˆλ‹€. ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ€ 각 후속 μˆ«μžκ°€ 이전 두 숫자의 합인 일련의 μˆ«μžλΌλŠ” 점을 κΈ°μ–΅ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 처음 0개의 μˆ«μžλŠ” 1, 1, 2, 3, 5, 8, 13, 21, 34, XNUMX와 κ°™μŠ΅λ‹ˆλ‹€.

μŠ€ν…Œμ΄μ§•

νŠΉμ • μ‹œν€€μŠ€μ˜ n번째 λ ˆμ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ•Ό ν•˜λ©°, n은 ν•¨μˆ˜μ— 인수둜 μ „λ‹¬λ˜λŠ” μˆ«μžμž…λ‹ˆλ‹€.

ν”Όλ³΄λ‚˜μΉ˜(3) // β€”> 2

이 μž‘μ—…μ—λŠ” μΈμˆ˜μ— μ§€μ •λœ 횟수만큼 루프λ₯Ό ν†΅κ³Όν•˜μ—¬ μ μ ˆν•œ μœ„μΉ˜μ— 값을 λ°˜ν™˜ν•˜λŠ” μž‘μ—…μ΄ ν¬ν•¨λ©λ‹ˆλ‹€. 문제λ₯Ό μ œκΈ°ν•˜λŠ” μ΄λŸ¬ν•œ λ°©λ²•μ—λŠ” 루프λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. λŒ€μ‹  μž¬κ·€λ₯Ό μ‚¬μš©ν•˜λ©΄ 면접관을 기쁘게 ν•˜κ³  λͺ‡ κ°€μ§€ μΆ”κ°€ 점수λ₯Ό 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°μ •

const fibonacci = num => {
  // store the Fibonacci sequence you're going
  // to generate inside an array and
  // initialize the array with the first two
  // numbers of the sequence
  const result = [0, 1]
 
  for(let i = 2; i <= num; i++) {
    // push the sum of the two numbers
    // preceding the position of i in the result array
    // at the end of the result array
    const prevNum1 = result[i - 1]
    const prevNum2 = result[i - 2]
    result.push(prevNum1 + prevNum2)
  }
  // return the last value in the result array
  return result[num]
}

κ²°κ³Ό λ°°μ—΄μ—μ„œλŠ” μ‹œν€€μŠ€μ˜ 각 ν•­λͺ©μ΄ 이전 두 숫자의 합이기 λ•Œλ¬Έμ— 처음 두 μˆ«μžκ°€ μ‹œλ¦¬μ¦ˆμ— ν¬ν•¨λ©λ‹ˆλ‹€. 맨 μ²˜μŒμ—λŠ” λ‹€μŒ 숫자λ₯Ό μ–»κΈ° μœ„ν•΄ μ‚¬μš©ν•  수 μžˆλŠ” 두 개의 μˆ«μžκ°€ μ—†μœΌλ―€λ‘œ 루프가 μžλ™μœΌλ‘œ 숫자λ₯Ό 생성할 수 μ—†μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš°λ¦¬κ°€ μ•Œκ³  μžˆλ“―μ΄ 처음 두 μˆ«μžλŠ” 항상 0κ³Ό 1μž…λ‹ˆλ‹€. λ”°λΌμ„œ κ²°κ³Ό 배열을 μˆ˜λ™μœΌλ‘œ μ΄ˆκΈ°ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μž¬κ·€μ˜ 경우 λͺ¨λ“  것이 더 κ°„λ‹¨ν•˜λ©΄μ„œλ„ λ™μ‹œμ— 더 λ³΅μž‘ν•΄μ§‘λ‹ˆλ‹€.

const fibonacci = num => {
  // if num is either 0 or 1 return num
  if(num < 2) {
    return num
  }
  // recursion here
  return fibonacci(num - 1) + fibonacci(num - 2)
}

μš°λ¦¬λŠ” fibonacci()λ₯Ό 계속 ν˜ΈμΆœν•˜μ—¬ 점점 더 μž‘μ€ 숫자λ₯Ό 인수둜 μ „λ‹¬ν•©λ‹ˆλ‹€. μ „λ‹¬λœ μΈμˆ˜κ°€ 0 λ˜λŠ” 1이면 μ€‘μ§€λ©λ‹ˆλ‹€.

좜λ ₯

ν”„λ‘ νŠΈμ—”λ“œ λ˜λŠ” JavaScript 개발자 직업에 λŒ€ν•œ 인터뷰λ₯Ό ν–ˆλ‹€λ©΄(특히 μ£Όλ‹ˆμ–΄ 레벨인 경우) 이미 μ΄λŸ¬ν•œ μž‘μ—…μ„ μ ‘ν–ˆμ„ κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 아직 λ°œκ²¬ν•˜μ§€ λͺ»ν–ˆλ‹€λ©΄ ν–₯ν›„ 적어도 일반적인 κ°œλ°œμ—λŠ” μœ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

SkillboxλŠ” λ‹€μŒμ„ ꢌμž₯ν•©λ‹ˆλ‹€.

좜처 : habr.com

DDoS 보호, VPS VDS μ„œλ²„κ°€ μžˆλŠ” μ‚¬μ΄νŠΈλ₯Ό μœ„ν•œ μ•ˆμ •μ μΈ ν˜ΈμŠ€νŒ… κ΅¬μž… πŸ”₯ DDoS 곡격 λ°©μ§€ κΈ°λŠ₯이 νƒ‘μž¬λœ μ•ˆμ •μ μΈ μ›Ήμ‚¬μ΄νŠΈ ν˜ΈμŠ€νŒ…, VPS 및 VDS μ„œλ²„λ₯Ό κ΅¬λ§€ν•˜μ„Έμš” | ProHoster