카테고리
자료구조
나만의 카테고리
자료구조 - Stack
문제 링크
programmers.co.kr/learn/courses/30/lessons/76502
요점
- Stack을 사용하여 올바른 괄호를 판단하는 로직을 구현할 수 있다.
참고 지식
풀이 (Java)
import java.util.*;
class Solution {
private int answer = 0;
public int solution(String s) {
Stack<String> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
stack.clear();
s = s.substring(1, s.length()) + s.charAt(0);
for (int j = 0; j < s.length(); j++) {
// String targetString = "" + s.charAt(j); 사용시 시간이 평균 10%정도 늦어진다.
String targetString = s.substring(j, j+1);
if (stack.empty()) {
stack.push(targetString);
continue;
}
if (")".equals(targetString)) {
if ("(".equals(stack.peek())) stack.pop();
continue;
} else if ("}".equals(targetString)) {
if ("{".equals(stack.peek())) stack.pop();
continue;
} else if ("]".equals(targetString)) {
if ("[".equals(stack.peek())) stack.pop();
continue;
}
stack.push(targetString);
}
if (stack.empty()) {
answer++;
}
}
return answer;
}
}
올바른 괄호를 판단하는 문제가 나온다면 Stack을 사용하는 방법이 가장 먼저 떠오릅니다. 그래서 문제를 이해하고 로직을 떠올리는데 오랜시간이 걸리지 않은거 같습니다. 로직 전체는 간단합니다.
- 모든 문자에 대해서 아래 내용을 반복한다.
- 문자열의 맨 앞 문자를 뒤로 보낸다.
- 위에서 생성된 새로운 문자열에 대해 올바른 괄호를 판단한다.
- 올바르다면 answer를 1 증가시킨다.
결과는 성공적이지만 어떻게 하면 효율성을 더 높일 수 있을까 고민하다가 targetString을 뽑아낼 때 + 방식과 substring을 이용하는 방식 중에 어떤게 더 나을지 궁금했습니다.
+ (내부적 StringBuilder) 사용
String.substring() 사용
위에서 보듯이 공간효율적으로는 거의 차이가 없지만 시간효율적으로는 그래도 의미적인 차이가 있습니다. substring 내부에서는 배열로 변환해서 처리하고 + 는 내부적으로 StringBuilder를 사용합니다. 그래서 배열 할당이 더 오래 걸릴 줄 알았는데 아니였네요 ㅎㅎ
알고리즘 초보가 정리한 글입니다
더 좋은 방법이나 코드에 대한 코멘트 언제나 환영합니다!
반응형
'Algorithm > Algorithm Test' 카테고리의 다른 글
[프로그래머스] [1차] 캐시 (Java) (0) | 2021.05.30 |
---|---|
[프로그래머스] 호텔 방 배정 (Java) (0) | 2021.05.24 |
[프로그래머스] 징검다리 건너기 (0) | 2021.05.11 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (Java) (0) | 2021.04.29 |
[프로그래머스] 3진법 뒤집기(Java) (0) | 2021.03.28 |