자료구조와 알고리즘/문제풀기
백준 10799 - 쇠막대기
now0204
2023. 4. 5. 13:43
올바른 괄호문제를 응용한 문제이다.
해결방법
- (하나당 쇠막대기 1개로 간주 스택에 push()
- )닫는괄호 등장시
- 바로 인접한 여는 괄호 존재시 -->레이저로 간주 총 길이에 스택의 사이즈(총 쇠막대기)만큼 + (2등분 되므로 기존 쇠막대기 만큼 +됨)
- 인접한 여는 괄호가 없을 시 -->쇠막대기 끝을 의미 쇠막대기 하나 없어짐
-->>바로 인접한 여는괄호인지 아닌지를 판단하는게 중요하다.
풀이 1
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String input = br.readLine();
Stack ss = new Stack();
int result=0;
int presize=0;
for(char a: input.toCharArray()){
if(a ==')'){
ss.pop();
//()라면 (는넣자마자 pop 사이즈 일정
//-1해준것은 ()에 (한쪽 추가시에도 size증가해서
if(presize-1 == ss.size()){
result += ss.size()-1; //size()만큼 추가하고 레이저에 (때문에 result에 ++된거
//하나 빼준 것
}
}else {
ss.push(a);
result++;
presize = ss.size();
}
}
bw.write(result+"");
bw.flush();
bw.close();
}
()를 제외한 기존의 괄호크기를 저장해서
레이저인지, 쇠막대기의 끝인지 확인하는 방법을 선택했다.
여는괄호 일때, 스택에 여는괄호를 저장하면서, presize = 스택사이즈 저장
닫는괄호 등장시
- ()로 바로 사라짐 따라서 기존 사이즈 변화 없음 레이저 발동 -->단 레이저의 (로 presize++됨 따라서 presize-1와 닫는괄호로 하나 pop된 스택 사이즈 비교
- 여는괄호 없이 닫는괄호만 등장시 --pop된 사이즈가 presize보다 작아짐 ---> 쇠막대기 끝 레이저 발동x