어흥
[백준 15926] 현욱은 괄호왕이야!! (C++, Java) 본문
728x90
반응형
문제 링크: https://www.acmicpc.net/problem/15926
1. 주의할 점
- 스택을 사용해서 해결한다 → O(N)에 해결
2. 구현
- 스택에 문자와 문자가 위치했던 인덱스 번호를 구조체 형태로 저장하여 쌓는다
- 이때, 스택의 Top에 위치한 원소와 현재 검색하려는 원소가 쌍이라면 스택의 원소를 뺀다
- 이외의 경우에는 스택에 원소를 추가한다
- 위의 방법을 통해 스택에는 쌍을 못이룬 문자들에 대한 정보만 담고 있다
- 쌍을 못 이룬 문자들이 위치한 인덱스를 바탕으로 인덱스의 차를 이용하여 가장 긴 올바른 괄호의 길이를 구한다. 이때, 첫 길이는 문자열의 길이 - 스택의 Top으로 설정한다
[C++]
#include <iostream>
#include <string>
#include <algorithm>
#include <stack>
using namespace std;
struct info{
char c;
int idx;
};
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int num,answer=0;
string str;
cin>>num>>str;
stack<info> s;
for(int i=0;i<num;i++){
char c = str[i];
if(s.empty()){
s.push({c,i});
continue;
}
char topChar = s.top().c;
if(topChar=='(' && c==')') s.pop();
else s.push({c,i});
}
int temp = num;
while(!s.empty()){
int idx = s.top().idx;
int diff = temp-idx-1;
if(diff>1) answer = max(answer, diff);
temp=idx;
s.pop();
}
answer = max(answer,temp);
cout<<answer;
return 0;
}
[Java]
import java.util.*;
import java.lang.*;
import java.io.*;
class Main {
public static void main (String[] args) throws java.lang.Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
String str = br.readLine();
Stack<Integer> s = new Stack<>();
s.add(-1);
int answer = 0;
for(int i=0;i<num;i++){
char c = str.charAt(i);
if(c=='(') s.add(i);
else{
s.pop();
if(s.empty()){
s.add(i);
continue;
}
int idx = s.peek();
answer = Math.max(answer,i-idx);
}
}
System.out.print(answer);
}
}
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 22234] 가희와 은행 (Java) (0) | 2022.03.21 |
---|---|
[백준 22232] 가희와 파일 탐색기 (Java) (0) | 2022.03.21 |
[백준 24513] 좀비 바이러스 (Java) (0) | 2022.02.21 |
[백준 16964] DFS 스페셜 저지 (Java) (0) | 2022.02.16 |
[백준 19598] 최소 회의실 개수 (C++) (0) | 2022.02.11 |
Comments