์Šคํƒ (stack)

Last In Firtst Out ๋จผ์ € ๋“ค์–ด๊ฐ„ ์ž๋ฃŒ๊ฐ€ ๋‚˜์ค‘์— ๋‚˜์˜ค๋Š” ํ›„์ž…์„ ์ถœ ์ž๋ฃŒ๊ตฌ์กฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ stack์€ ๋ฐฐ์—ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋Š” push() ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” pop() ์˜ ์‚ฌ์šฉ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์Šคํƒ์˜ ์‹œ๊ฐ„๋ณต์žก๋„

์‚ฝ์ž…  O(1)
์‚ญ์ œ O(1)
ํƒ์ƒ‰ O(n)

ํƒ์ƒ‰์„ ํ•  ๋•Œ n๊ฐœ ์š”์†Œ๋ฅผ ๋Œ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด๋‹ค. n๋ฒˆ์งธ ์š”์†Œ์— ์ ‘๊ทผํ•  ๋•Œ pop()์„ n๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋ฉด n๋ฒˆ์งธ ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. pop()์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1) ์ด๋ฏ€๋กœ n๋ฒˆ์งธ ์š”์†Œ์— ์ ‘๊ทผํ•˜๋Š” ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.

 

 


์˜ˆ์‹œ ๋ฌธ์ œ 1

๊ด„ํ˜ธ์˜ ์ง์ด ๋งž์œผ๋ฉด "YES"๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ๋งž์ง€ ์•Š์œผ๋ฉด "NO"๋ฅผ ๋ฆฌํ„ดํ•ด๋ผ

 

const solution = (str) => {
  // ๋ฐฐ์—ด์„ for๋ฌธ์œผ๋กœ ๋Œ๋ฉด์„œ (์ด๋ฉด push )์ด๋ฉด popํ•ด์„œ ํ•˜๋‚˜๋„ ์•ˆ๋‚จ์•„์žˆ์œผ๋ฉด yes ๋ฆฌํ„ด, ํ•˜๋‚˜๋ผ๋„ ๋‚จ์•„์žˆ์œผ๋ฉด no ๋ฆฌํ„ด
  let answer = "YES";
  let newArr = [];

  for (let x of str) {
    if (x === '(') newArr.push(x);
    else {
      if (newArr.length === 0) {
        return "No";
      }
      newArr.pop(x);
    }
  }

  if (newArr.length === 0) {
    return answer;
  } else {
    return "NO";
  }
}

const str = "()()"
console.log(solution(str));

 

์˜ˆ์‹œ ๋ฌธ์ œ 2

์‡ ๋ง‰๋Œ€๊ธฐ๋Š” ์ž์‹ ๋ณด๋‹ค ๊ธด ์‡ ๋ง‰๋Œ€๊ธฐ ์œ„์—๋งŒ ๋†“์ผ ์ˆ˜ ์žˆ๋‹ค. ์‡ ๋ง‰๋Œ€๊ธฐ๋ฅผ ๋‹ค๋ฅธ ์‡ ๋ง‰๋Œ€๊ธฐ ์œ„ํ—ค ๋†“๋Š” ๊ฒฝ์šฐ ์™„์ „ํžˆ ํฌํ•จ๋˜๋„๋ก ๋†“๊ณ , ๋์ ์€ ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค.

 

๋ ˆ์ด์ €๋Š” ๊ด„ํ˜ธ์˜ ์Œ์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค =>  '( )'

์‡ ๋ง‰๋Œ€๊ธฐ์˜ ์™ผ์ชฝ ๋์€ ์—ฌ๋Š” ๊ด„ํ˜ธ '( ' ์ด๊ณ  ์˜ค๋ฅธ์ชฝ ๋์€ ๋‹ซํžŒ ๊ด„ํ˜ธ ')'๋กœ ํ‘œํ˜„๋œ๋‹ค.

 

์‡ ๋ง‰๋Œ€๊ธฐ๋Š” ๋ ˆ์ด์ €์— ์˜ํ•ด ๋ช‡ ๊ฐœ์˜ ์กฐ๊ฐ์œผ๋กœ ์ž˜๋ ค์ง„๋‹ค. 

์‡ ๋ง‰๋Œ€๊ธฐ์™€ ๋ ˆ์ด์ €์˜ ๋ฐฐ์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ด„ํ˜ธ ํ‘œํ˜„์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ž˜๋ ค์ง„ ์‡ ๋ง‰๋Œ€๊ธฐ ์กฐ๊ฐ์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•ด๋ผ. 

 

์ž…๋ ฅ์˜ˆ์ œ

()(((()())(())()))(())

์ถœ๋ ฅ์˜ˆ์ œ

17

 

const solution = (str) => {
  let answer = 0;
  let stack = [];

  // ์—ฌ๋Š” ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ง‰๋Œ€๊ธฐ์˜ ์‹œ์ž‘์  ๋˜๋Š” ๋ ˆ์ด์ €์˜ ์‹œ์ž‘์ ์ด๋‹ค. -> stack์— ํ‘ธ์‹œ
  // ๋‹ซ๋Š” ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ง‰๋Œ€๊ธฐ์˜ ๋‹ซ๋Š”์ ์ธ์ง€ ๋ ˆ์ด์ €์˜ ๋‹ซ๋Š”์ ์ธ์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค -> ๋ฐ”๋กœ ์•ž์„ ์‚ดํŽด๋ณธ๋‹ค

  for (let i = 0; i < str.length; i++) {
    if (str[i] === '(') { // str[i]๊ฐ€ ์—ฌ๋Š” ๊ด„ํ˜ธ์ผ ๊ฒฝ์šฐ
      stack.push(str[i]);
    } else { // str[i]๊ฐ€ ๋‹ซ๋Š” ๊ด„ํ˜ธ์ผ ๊ฒฝ์šฐ
      stack.pop();
      if (str[i - 1] === '(') { // ๋ ˆ์ด์ €์ธ ๊ฒฝ์šฐ
        // ๋ง‰๋Œ€๊ธฐ๊ฐ€ ๋ช‡ ๊ฐœ๊ฐ€ ์ž˜๋ฆฌ๋Š” ์ง€ answer์— ์นด์šดํŒ… -> stack์˜ length ๋ˆ„์ 
        answer += stack.length;
      } else { // ๋ง‰๋Œ€๊ธฐ์˜ ๋์ธ ๊ฒฝ์šฐ
        // ๋‹ซ๋Š” ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜๋Š” popํ•ด์•ผํ•œ๋‹ค.
        answer++;
      }
    }
  }
  return answer;
}

const str = "()(((()())(())()))(())";
console.log(solution(str));

 

 

 

+ Recent posts