CS/Solutions

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] λ¬Έμžμ—΄ κ³„μ‚°ν•˜κΈ° (JavaScript 문제 풀이)

μ„€λΉˆ 2023. 12. 19. 19:26
λ°˜μ‘ν˜•

πŸ“ 문제 μ„€λͺ…

my_string은 "3 + 5"처럼 λ¬Έμžμ—΄λ‘œ 된 μˆ˜μ‹μž…λ‹ˆλ‹€. λ¬Έμžμ—΄ my_string이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μˆ˜μ‹μ„ κ³„μ‚°ν•œ 값을 return ν•˜λŠ” solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

πŸ” μ œν•œμ‚¬ν•­

  • μ—°μ‚°μžλŠ” +, -만 μ‘΄μž¬ν•©λ‹ˆλ‹€.
  • λ¬Έμžμ—΄μ˜ μ‹œμž‘κ³Ό λμ—λŠ” 곡백이 μ—†μŠ΅λ‹ˆλ‹€.
  • 0으둜 μ‹œμž‘ν•˜λŠ” μˆ«μžλŠ” 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
  • 잘λͺ»λœ μˆ˜μ‹μ€ 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
  • 5 ≤ my_string의 길이 ≤ 100
  • my_string을 κ³„μ‚°ν•œ 결과값은 1 이상 100,000 μ΄ν•˜μž…λ‹ˆλ‹€.
    • my_string의 쀑간 계산 값은 -100,000 이상 100,000 μ΄ν•˜μž…λ‹ˆλ‹€.
    • 계산에 μ‚¬μš©ν•˜λŠ” μˆ«μžλŠ” 1 이상 20,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
    • my_stringμ—λŠ” μ—°μ‚°μžκ°€ 적어도 ν•˜λ‚˜ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • return type 은 μ •μˆ˜ν˜•μž…λ‹ˆλ‹€.
  • my_string의 μˆ«μžμ™€ μ—°μ‚°μžλŠ” 곡백 ν•˜λ‚˜λ‘œ κ΅¬λΆ„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

πŸ“₯ μž…μΆœλ ₯ 예

my_string result
"3 + 4" 7

 


πŸ’» λ‚˜μ˜ 풀이

λ‹€λ₯Έ μ‚¬λžŒμ˜ ν’€μ΄μ—μ„œλŠ” eval ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄ μˆ˜μ‹μ„ κ³„μ‚°ν–ˆμ§€λ§Œ, λ³΄μ•ˆμƒμ˜ 이유둜 eval의 μ‚¬μš©μ€ ꢌμž₯λ˜μ§€ μ•Šμ•„μš”.
eval ν•¨μˆ˜μ— λŒ€ν•œ μ„€λͺ…은 MDN Web Docsμ—μ„œ 확인할 수 μžˆμ–΄μš”.

eval은 μ „λ‹¬λœ λ¬Έμžμ—΄μ„ JavaScript μ½”λ“œμ˜ μΌλΆ€λ‘œ μ‹€ν–‰ν•΄μš”. 이 λ•Œλ¬Έμ— μ•…μ˜μ μΈ μ‚¬μš©μžκ°€ 슀크립트λ₯Ό μ£Όμž…ν•  수 μžˆλŠ” κ°€λŠ₯성이 μžˆμ–΄μš”. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μž μž…λ ₯을 검증 없이 eval에 μ „λ‹¬ν•œλ‹€λ©΄, μ‚¬μš©μžλŠ” μž„μ˜μ˜ JavaScript μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 있게 λ˜μ–΄, XSS(크둜슀 μ‚¬μ΄νŠΈ μŠ€ν¬λ¦½νŒ…) 곡격에 μ·¨μ•½ν•΄μ§ˆ 수 μžˆμ–΄μš”.

 

  1. μˆ˜μ‹ 뢄리: μž…λ ₯된 λ¬Έμžμ—΄ my_string을 곡백을 κΈ°μ€€μœΌλ‘œ λΆ„λ¦¬ν•˜μ—¬ λ°°μ—΄ parts둜 λ³€ν™˜ν•©λ‹ˆλ‹€. 이 λ°°μ—΄μ—λŠ” μˆ«μžμ™€ μ—°μ‚°μžκ°€ λ²ˆκ°ˆμ•„ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
  2. 초기 κ°’ μ„€μ •: parts λ°°μ—΄μ˜ 첫 번째 μš”μ†Œ(첫 번째 숫자)λ₯Ό μ •μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ result λ³€μˆ˜μ— ν• λ‹Ήν•©λ‹ˆλ‹€. 이 값은 μ΅œμ’… 계산 κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ 초기 κ°’μž…λ‹ˆλ‹€.
  3. λ°°μ—΄ 순회 및 계산 μˆ˜ν–‰: parts 배열을 μˆœνšŒν•˜λ©΄μ„œ λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€:
    • 각 μˆœνšŒμ—μ„œ μ—°μ‚°μž(+ λ˜λŠ” -)λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.
    • μ—°μ‚°μž λ‹€μŒμ— μ˜€λŠ” 숫자λ₯Ό μ •μˆ˜λ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
    • ν™•μΈλœ μ—°μ‚°μžμ— 따라 result에 λˆ„μ  계산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€ (result += number λ˜λŠ” result -= number).
  4. κ²°κ³Ό λ°˜ν™˜: λͺ¨λ“  계산이 μ™„λ£Œλ˜λ©΄ μ΅œμ’… result 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
function solution(my_string) {
    const parts = my_string.split(" ");
    let result = parseInt(parts[0]);

    for (let i = 1; i < parts.length; i += 2) {
        const operator = parts[i];
        const number = parseInt(parts[i + 1]);

        if (operator === "+") {
            result += number;
        } else if (operator === "-") {
            result -= number;
        }
    }

    return result;
}
λ°˜μ‘ν˜•