https://school.programmers.co.kr/learn/courses/30/lessons/12909
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
입력
s - 문자열
출력
answer - true (올바른 괄호 '(' 다음 ')' ) / false 나머지.
제한사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
풀이
이 문제는 스택과 순서를 활용한 문제이다. 스택을 활용하여 '(' 다음에 ')'이 오면 '('를 pop()하도록 구현하면 된다.
따라서 스택을 구현할 배열과 주어진 문자열을 한 번 순회할 때 필요한 조건문을 적으면 된다. 어떤 경우에 false인지 혹은 push()나 pop() 메서드를 사용해야 할지 정리하기 위해 표를 사용하였다.
스택 마지막 원소 | 순회하고 있는 원소 | 명령 (statement) |
X(없는 경우) | '(' | push('(') |
')' | return false | |
'(' | '(' | push('(') |
')' | pop() |
위의 표를 그려보니 스택 마지막 원소가 뭔지와 관계없이 무조건 '('가 들어가면 push('(')를 하였다.
결과적으로 코드를 구현하는 것은
- 문자열 s의 순회
- 순회하는 순간의 타겟 원소가 '('인 경우 push() 메서드 사용
- 순회하는 순간의 타겟 원소가 ')'인 경우 pop() 메서드 사용
- 나머지는 false를 반환한다.
- 순회가 끝나고 스택에 원소가 남으면 false를 반환하고 아닌 경우 true를 반환한다.
이렇게 코드를 구현하였다.
시간 복잡도는 문자열 s를 한 번 순회하는 데에 걸리는 시간인 O(n)이다.
공간 복잡도는 스택을 담는 공간인 O(n)이다.
코드
function solution(s){
const stk = [];
for (v of s) {
if (v==='(') stk.push(v);
else if (v===')' && stk.at(-1)==='(') stk.pop();
else return false;
}
return stk.length>0 ? false : true;
}
for문, while문, forEach메서드 등 같은 순회하는 기능인데 성능을 비교하고 싶다.
다른 사람의 풀이를 보니 인덱스로 풀었다. 대단하다.
굳이 스택 배열을 사용하지 않고 정수로만 표현해도 될 것 같다. ( 스택에는 '('만 들어가기 때문이다.)
728x90
'Computer > 알고리즘' 카테고리의 다른 글
[JS] 프로그래머스 다리를 지나는 트럭 (3) | 2025.01.24 |
---|---|
[JS] 프로그래머스 프로세스 (1) | 2025.01.23 |
[JS] 프로그래머스 기능개발 (3) | 2025.01.21 |
[JS] 프로그래머스 같은 숫자는 싫어 (2) | 2025.01.20 |
[JS] 프로그래머스 숫자 짝궁 (2) | 2025.01.20 |