인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

기하학곡선님의 프로필 이미지

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

2. 괄호 문자 제거(스택)

코드 리뷰 부탁드립니다.

작성

·

183

0

  function solution(s) {
        let answer = "";
        let stack = [];
        for (let x of s) {
          if (x === "(") stack.push(x);
          else if (x === ")") {
            stack.pop();
          } else if (stack.length === 0) answer += x;
        }

        return answer;
      }

")"문자를 만나기 전까지 모두 push() 하는것이 아닌 알파벳 문자를 만났을때 스택에 괄호가 존재한다면 괄호로 감싸진 문자열이기 때문에 0일때만 answer에 더했습니다. 괜찮은 답일까요?

답변 2

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

네. 예외 없이 잘 나오는 코드입니다. 잘 하셨습니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴이에요. 코드 리뷰 요청 감사합니다.

주어진 코드를 살펴보면, 문자열 s에 있는 괄호로 감싸진 문자열을 추출하는 로직 같아 보입니다. 알파벳 문자를 만났을 때 스택에 괄호가 존재한다면 괄호로 감싸진 문자열이라고 가정하고, 괄호인지 확인한 후 answer에 더하는 부분이 있습니다.

주어진 요구사항에 따라서는 정상 동작할 수도 있지만, 몇 가지 문제가 있어 개선이 필요할 것 같습니다.

  1. 문제의 제약사항에 따라 스택에 괄호가 존재하는지 확인하는 부분은 필요하지 않습니다. 왜냐하면 스택에 있는 괄호가 없어도 알파벳 문자가 나온다면 그 문자도 괄호로 감싸진 문자열이 아닐 수 있기 때문입니다. 예를 들어, “a(b)c”와 같은 문자열의 경우에도 처리가 되어야 합니다.

  2. 스택에서 “(” 문자를 pop할 때 스택이 비어있을 경우에 대한 처리가 없습니다. 이 경우에는 pop할 괄호가 없기 때문에 오류가 발생할 것입니다. 따라서, pop 연산을 하기 전에 스택이 비어있는지 확인하는 로직을 추가해야 합니다.

  3. 변수명이 일부 헷갈릴 수 있습니다. x는 괄호나 알파벳 문자를 가리키고, 스택에는 “(” 문자만 저장되는데, 변수명을 좀 더 명확하게 지어주는 것이 좋을 것 같습니다. 예를 들어, 표현력을 좀 더 갖게 하기 위해 stack 변수를 bracketStack이나 openingBracketStack으로 변경해보세요.

개선된 코드는 아래와 같습니다.

function solution(s) {
  let answer = "";
  let openingBracketStack = [];
  for (let character of s) {
    if (character === "(") {
      openingBracketStack.push(character);
    } else if (character === ")") {
      if (openingBracketStack.length !== 0) {
        openingBracketStack.pop();
      }
    } else if (openingBracketStack.length === 0) {
      answer += character;
    }
  }

  return answer;
}

이렇게 개선된 코드로 테스트를 하면, 주어진 문자열에서 괄호로 감싸진 문자열을 정상적으로 추출할 수 있을 것입니다. 이상적으로는 테스트 케이스를 더 추가하여 코드의 정확성을 보장해야 하지만, 제가 주어진 설명을 바탕으로 가장 핵심적인 개선점을 설명드렸습니다.

추가적인 궁금한 사항이 있으시면 언제든지 질문해주세요. 도움이 되었기를 바라며, 좋은 결과 있기를 기대합니다. 감사합니다!