<문제>
<풀이>
이건 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\n");
} else {
bw.write("NO\n");
}
여기에서 스택이 비었을 경우로 가니까, 올바르지 않은 문장인데 YES가 떠버림.
'알고리즘 공부...공......공' 카테고리의 다른 글
[백준: 알고리즘_Java] 1463_1로 만들기 (2) | 2022.01.02 |
---|---|
[백준: 알고리즘_Java] 17298_오큰수 (0) | 2022.01.01 |
[백준: 알고리즘_Java] 1874번_스택 수열 (1) | 2021.12.29 |
[백준: 알고리즘_Java] 9093_단어 뒤집기 (0) | 2021.12.24 |
[백준: 알고리즘_Java] 10828_스택 (0) | 2021.12.24 |
댓글