Problem Solving/프로그래머스

[프로그래머스/JavaScript] 올바른 괄호

세고래 2022. 10. 25. 18:09

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1) 풀이

사실 휴학시절에 c++로 제일 많이 풀었던 문제가, 올바른 괄호인지 아닌지 스택을 이용해서 체크하는 문제였어서

레벨 2여도 손쉽게 풀 수 있었다! 테케도 다 맞고, 정답 제출에서도 모두 정답으로 나왔는데

내 발목을 잡는 건 효율성 문제 였다 😥

 

일단 문자열 s 를 탐색하면서 ( 여는 괄호의 경우에는 스택 배열에 넣어주고,

) 닫는 괄호일 경우 stack 의 제일 최근 요소를 pop 해서 여는 괄호일 경우 넘어가고 아닐 경우에는 false를 넘겨준다

문자열 s 를 모두 탐색한 이후에는 만들어준 스택 배열의 길이를 확인하고, 0이 아닐 경우 false,

그외의 경우는 모두 true를 반환한다

 

이것저것 고치다가 내 코드의 쓸데없는 부분을 깨달았다

1. 내가 만든 스택 배열 (stack)에는 애초에 ) 괄호는 들어가지 않는데, pop한 요소가 ) 일 경우를 예외 처리 해주었다

2. s[0]===")" 일 경우, 먼저 false를 반환해주도록 코드를 짰는데, ) 닫는 괄호의 경우 stack 길이를 확인해주는 코드가 있기 때문에 중복되는 내용이다

 

이 두 경우를 모두 삭제하니, 효율성 문제가 통과되었다!

어떤 식으로 효율성 문제가 난 건지 확인하기 위해서 1만 지워보고, 2만 지워보고 했는데

둘 중 하나라도 지우고 돌리면 효율성 문제가 나지 않았다..! 이유가 뭔지는 잘 모르겠다

문제 자체가 이상한 건가? 싶기도 한 게.. 같은 코드라도 어떤 줄에 탭(tab) 이 하나 들어가있으면 

효율성 문제가 날 때도 있고.. 효율성 문제가 난 코드더라도 어떤 때에는 효율성 문제가 나지 않고 정답처리가 난다

일단 이 문제는 보류해보는 걸로.. 이 문제에 대해서 어떤 이유로 효율성 문제가 나는 건지 아시는 분은 댓글 부탁드려용

 

그래도 일단 이 문제 풀면서, 자바스크립트의 배열은 다른 언어의 배열과는 다소 다르다는 것을 알게 되었다

참고자료 - 자바스크립트 배열

다음에 이것에 대해서도 자세히 포스팅해야겠다

2) 최종 소스코드
function solution(s) {
  const stack = [];
  for (let i = 0; i < s.length; i++) {
    if (s[i] === "(") stack.push(s[i]);
    else {
      if (stack.length === 0) return false;
      stack.pop();
    }
  }
  if (stack.length !== 0) return false;
  return true;
}
3) 참고자료

https://poiemaweb.com/js-array-is-not-arrray

 

Array | PoiemaWeb

자바스크립트 배열은 배열이 아니다.

poiemaweb.com

 

728x90