알고리즘/코딩테스트 문제 정리
[코딩 테스트 합격자 되기] 괄호 문제 알고보니 Lv.2
고래강이
2025. 1. 6. 15:08
☄️ 문제 접근 및 내 생각
1. 저번 시간 사용했던 스택 문제의 심화 버전인 것 같다.
2. 일단 조건에 부합하는 올바른 문자열인지를 구하고, 이후 *2를 해서 찾은 문자열의 시작 인덱스를 구하게 되면 문제를 해결할 수 있을 것 같다.
3. 이전에 했던 count를 +, -해서 결과는 나타내는 방식은 사용할 수 없었다. 그렇기에 괄호끼리 순서별로 정렬해서 한 번 나타내보려했는데 돌려서 확인을 하면 더 쉬울 것 같아서 일단 돌려보기로 했다. 근데 문제 자체가 이런식의 접근 아닌 것 같다는 생각이 들었다.
4. 어떻게 접근해야할 지 다시 고민해보았음.
5. 문제 자체를 잘못 이해했다. 애초에 왼쪽으로 무조건 length만큼 이동해서 length 길이만큼의 문자열 개수를 구하고 이 중에서 괄호가 올바르게 구성된 애들은 몇 개인지 총 개수를 구하는 문제임
소요시간: 80분 + a(문제 이해를 잘못함)
🌈 파이썬 코드
import myReadline
# 문제 10 괄호 회전하기
def solution_10(string):
result = 0
s = list(string)
for i in range(len(s)):
stack = [] # 빈배열은 False 값이다.
for j in range(len(s)):
if not stack:
stack.append(s[j])
else:
if s[j] == ']' and stack[-1] == '[': stack.pop()
elif s[j] == '}' and stack[-1] == '{': stack.pop()
elif s[j] == ')' and stack[-1] == '(': stack.pop()
if not stack:
result += 1
s.append(s.pop(0))
return result
examples_10 = myReadline.get_example("stack_10.txt")
for example in examples_10.values():
print(solution_10(example))
- 처음에 문제를 잘못 이해해서 많이 시간이 걸렸다. 그래서 다시 이해하고 하는 +a시간은 걍 제외를 했다.
- s.append(s.pop(0))이부분이 굉장히 인상깊었다 앞에 값을 맨 뒤로 돌리는 방식으로 나중에 여러번 활용할 가능성이 있다고 느껴진다.
- 해당 문자열이 올바른 괄호를 가지고 있는지에 대한 개수를 구하는 문제이기에 짝이 올바르게 맞아야한다라는 뜻은 닫힘 괄호가 등장했을 때 바로 이전 괄호는 열린 괄호여야하며 이를 중심으로 생각하고 풀어보니 괜찮았다.
- 조건문 부분에서는 not 연산자를 많이 활용했는데 짧게 하는 게 편해서 이렇게 한거지 읽기에 좀 더 쉽게하려면 len()을 쓰는 게 더 보기 좋을 것 같다.
🌈 자바스크립트 코드
const string = "[](){}";
function solution(string) {
let result = 0;
const array = [...string];
for (let i = 0; i < array.length; i++) {
const stack = [];
// forEach 안에서는 break 못쓴다. forEach는 내부적으로 콜백함수로 구현되어 있기 때문
array.forEach((value) => {
if (stack.length === 0) {
stack.push(value);
} else {
if (value === "]" && stack[stack.length - 1] === "[") stack.pop();
else if (value === "}" && stack[stack.length - 1] === "{") stack.pop();
else if (value === ")" && stack[stack.length - 1] === "(") stack.pop();
else stack.push(value);
}
});
if (stack.length === 0) result++; // JS에서는 빈 배열은 true이니 이거 조심하자
array.push(array.shift());
}
return result;
}
console.log(solution(string));
- 빈 배열이 trustly 값인 것만 유의고, forEach문 안에서 break는 사용불가능하다는 것만 기억하자