on
[백준: 알고리즘_Java] 9012번_괄호
[백준: 알고리즘_Java] 9012번_괄호
<문제>
<풀이>
이건 Scanner를 사용해도 시간 초과가 안뜨지만
그냥 버퍼를 씀. 그냥. 그냥. 그냥
올바른 괄호만드는 구조를 잘 살펴보자면…
(()()) —>이걸 예시로 보겠음
앞에서부터 괄호를 확인하는데 닫는괄호 ')'가 나오면 그 전의 짝이 없는 괄호 중 제일 마지막으로 봤던 괄호 랑 짝을 맞춘다.
제일 마지막걸 뺀다는 것에서.. Stack을 이용해야겠다는 생각이 들음.
왜냐?! Stack은 Last In First Out 구조이기 때문.
(사실 중간고사 시험 보기 전에 스택 공부해야되서 이거 풀이 찾아봤었음. 그래서 스택 이용해야된다는 걸 알았다. 안 봤으면 풀기 힘들었을 듯…..)
1. 괄호문장을 입력받아 char배열에 넣음.
2. char 배열의 요소들을 순서대로 검사
3. '(' 나오면 Stack에 값 추가 (아무거나)
4. ')' 나오면 Stack에 값 빼기
(주의사항: 값 빼기 전에 스택이 비어있는지 확인 한 다음, 비었으면 스택에 값 아무거나 추가해 놓고 break로 반복문 빠져나옴. -> 5번으로 감.)
5. 다 검사한 후, Stack이 비어있으면 YES(올바른 괄호문), 안 비었으면 NO.
다음문장을 입력받기 전에 write()
++bw.close() 혹은 bw.flush() 해 주어야 제대로 출력됨.
<결과>
나올 수 있는 결과 다 나왔네...
틀렸던 이유...
처음 런타임 에러는
else if(c == ')') { stack.pop(); }
이렇게만 해놔서, stack이 비었을 때도 pop()돼서..
그 다음 컴파일 에러는... 걍 클래스 이름 Main으로 바꾸는 걸 깜빡해서..
다음 틀렸습니다는..
else if(c == ')') { if(!stack.empty()){ stack.pop(); } else { //stack.push(0); break; } }
이렇게 스택이 비었을 때, 값을 추가 안 해줘서 밑에
if(stack.empty()) { bw.write("YES
"); } else { bw.write("NO
"); }
여기에서 스택이 비었을 경우로 가니까, 올바르지 않은 문장인데 YES가 떠버림.
from http://santokki.tistory.com/10 by ccl(A) rewrite - 2021-12-26 04:01:46