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
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스/JavaScript] 3진법 뒤집기 (0) | 2022.11.03 |
---|---|
[프로그래머스/JavaScript] JadenCase 문자열 만들기 (0) | 2022.11.03 |
[프로그래머스/JavaScript] 2016년 (0) | 2022.10.23 |
[프로그래머스/JavaScript] 폰켓몬 (0) | 2022.10.23 |
[프로그래머스/JavaScript] 수박수박수박수박수박수? (0) | 2022.10.11 |