μžλ°”μŠ€ν¬λ¦½νŠΈ μ•Œκ³ λ¦¬μ¦˜

[μΈν”„λŸ° μ„Ήμ…˜6] μ‡ λ§‰λŒ€κΈ° (Javascript)

은진 2021. 6. 27. 02:20

μΈν”„λŸ°

πŸ‘©πŸ»β€πŸ’»λ¬Έμ œλ§ν¬

[μΈν”„λŸ° μ„Ήμ…˜6] μ‡ λ§‰λŒ€κΈ° (Javascript)
유료 κ°•μ˜μΈ κ΄€κ³„λ‘œ 문제 μ„€λͺ…은 μƒλž΅ν•©λ‹ˆλ‹€.


✍️Idea Sketch

2021-06-27

1. ()κ°€ λ ˆμ΄μ €, λ ˆμ΄μ €λŠ” μŠ€νƒμ— μŒ“μ§€ μ•ŠλŠ”λ‹€.

2. () λ ˆμ΄μ € ν•˜λ‚˜κ°€ μžˆμ„ λ•Œλ§ˆλ‹€ cnt += stack.length

3. λ ˆμ΄μ €κ°€ μ•„λ‹Œ ( κ°€ λ‚˜μ˜€λ©΄ stack.push(); cnt++;

4. λ ˆμ΄μ €κ°€ μ•„λ‹Œ ) κ°€ λ‚˜μ˜€λ©΄ stack.pop();

5. λ ˆμ΄μ € νŒλ³„ μ–΄λ–»κ²Œ?

  • ( κ°€ λ‚˜μ˜¬ λ•Œλ§ˆλ‹€ λ‹€μŒ μ›μ†Œκ°€ ) 인지 νŒλ³„ --> for (let x of str)을 λͺ» 씀
  • ) κ°€ λ‚˜μ˜¬ λ•Œλ§ˆλ‹€ μŠ€νƒ λ§ˆμ§€λ§‰ 값이 ( 인지 νŒλ³„ --> μŠ€νƒμ— μŒ“μ΄λŠ” 값은 항상 ( λΌμ„œ μ‹€νŒ¨
  • 항상 κ·Έ λ‹€μŒ μ›μ†Œλ₯Ό ν™•μΈν•΄λ³΄λŠ” 게 더 λ‚˜μ€κ°€? --> 6번
  • 일단 stack에 λ„£μ–΄λ†“μ•˜λ‹€κ°€ μ•Œκ³ λ³΄λ‹ˆ λ ˆμ΄μ €λΌμ„œ λ’€λŠ¦κ²Œ stack.pop(), cnt--ν•˜λŠ” 것보닀 λ‚˜μ„ λ“―
for (let i=0; i<str.length; i++) {
    if (str[i] === '(') {
        if (str[i+1] === ')') cnt += stack.length;  // λ ˆμ΄μ €μΈ 경우
    }
    else stack.pop();
}

문제점
str[i+1] 둜 λ ˆμ΄μ € νŒλ³„μ„ ν•˜λŠ” 경우,
for λ°˜λ³΅λ¬Έμ—μ„œ i++이 μ•„λ‹ˆλΌ i+2λ₯Ό μ‹€ν–‰ν•΄μ•Ό 함

6. '('λŠ” 무쑰건 stack.push(), cnt++ν•˜λŠ” 경우

  • ')'일 경우 이전 μ›μ†Œ 확인
  • () λ ˆμ΄μ €μΈ 경우 stack.pop();ν•œ ν›„ cnt += stack.length - 1;
  • λ ˆμ΄μ €κ°€ μ•„λ‹Œ 경우 stack.pop();
  • 5λ²ˆλ³΄λ‹€ 더 직관적인 둜직으둜 νŒλ‹¨
for (let i=0; i<str.length; i++) {
    if (str[i] === '(') {
        stack.push(str[i]);
        cnt++;
    }
    else if (str[i-1] === '(') {  // str[i] === ')' μ΄λ―€λ‘œ λ ˆμ΄μ €
        stack.pop();
        cnt += stack.length - 1;
    }
    else { // str[i] === ')' μ‡ λ§‰λŒ€κΈ° 끝점
        stack.pop();
    }
}


  • str[i] === ')' 인 경우 항상 stack.pop(); μ‹€ν–‰ν•˜λ―€λ‘œ 둜직 μˆ˜μ •
for (let i = 0; i < str.length; i++) {
    if (str[i] === '(') {
        stack.push(str[i]);
        cnt++;
    }
    else {
        stack.pop();
        if (str[i - 1] === '(') cnt += stack.length - 1;  // λ ˆμ΄μ €μΈ 경우
    }
}


βœοΈμ†ŒμŠ€μ½”λ“œ

2021-06-27

function solution(str) {
    let cnt = 0;
    let stack = [];

    for (let i = 0; i < str.length; i++) {
        if (str[i] === '(') {
            stack.push(str[i]);
            cnt++;
        }
        else {
            stack.pop();
            if (str[i - 1] === '(') cnt += stack.length - 1;  // λ ˆμ΄μ €μΈ 경우
        }
    }

    return cnt;
}