반응형
문제
https://www.acmicpc.net/problem/4949
코드
import java.io.*;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
while (true) {
String str = br.readLine();
if (str.equals(".")) {
break;
}
sb.append(getAnswer(str)).append("\n");
}
System.out.println(sb);
}
private static String getAnswer(String str) {
Stack<Character> stack = new Stack<>();
for (char c : str.toCharArray()) {
if (c == '(' || c == '[') {
stack.push(c);
} else if (c == ')' || c == ']') {
if (stack.isEmpty()) {
return "no";
}
if ((stack.peek() == '(' && c == ')') || (stack.peek() == '[' && c == ']')) {
stack.pop();
} else {
return "no";
}
}
}
return stack.isEmpty() ? "yes" : "no";
}
}
풀이
처음 작성한 코드
import java.io.*;
import java.util.Stack;
public class bj_4949 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Stack<Character> stack = new Stack<>();
StringBuilder sb = new StringBuilder();
while (true) {
String str = br.readLine();
if (str.equals(".")) {
break;
}
for (char c : str.toCharArray()) {
if (c == '(' || c == '[') {
stack.push(c);
} else if (c == ')' || c == ']') {
if (stack.isEmpty()) {
sb.append("no").append("\n");
continue;
}
if ((stack.peek() == '(' && c == ')') || (stack.peek() == '[' && c == ']')) {
stack.pop();
} else {
sb.append("no").append("\n");
continue;
}
}
}
sb.append(stack.isEmpty() ? "yes" : "no").append("\n");
}
System.out.println(sb);
}
}
내가 구상한 로직대로 코드를 작성한 뒤 예제 입력 1을 실행해보았다. 그런데 출력 결과의 개수가 입력 개수보다 많아서 어디가 잘못됐는지 확인하기 위해 `while` 문 맨 앞에 `"시작"`이라는 출력을 추가하고, 다시 예제 입력 1을 돌려보며 출력값을 살펴보았다.
예상 출력
yes
yes
no
no
no
yes
yes
실제 출력
시작
yes
시작
yes
시작
no
no
시작
no
시작
no
no
시작
no
시작
no
문제가 많았다. 한 문장에 `"no"`가 두 번 출력되고, 맨 마지막 문제들은 아예 틀렸다.
뭐가 문제지 하니깐... 아 stack을 초기화 안해주었구나... 그래서 `Stack<Character> stack = new Stack<>();`의 위치를 `While`문 아래로 옮겨주었다. 이렇게하니 아래 두 문자열은 예상 출력과 일치했다.
이제 남은 문제는 `"no"`가 두 번씩 출력된다는 것이었다. 원래는 `"no"`를 출력한뒤 `continue`로 처리했는데 `while`과 `for`문 이중 루프 구조라 한 번에 완전히 빠져나오지 못했던 것같다. 그래서 별도의 함수 `getAnswer()`로 분리하고 `return`을 사용해 즉시 함수가 종료되도록 수정했다.
반응형
'백준' 카테고리의 다른 글
[백준] 2667: 단지번호붙이기 (0) | 2025.04.21 |
---|---|
[백준] 7568: 덩치 (0) | 2025.04.18 |
[백준] 2275: 부녀회장이 될테야 (0) | 2025.04.16 |
[백준] 21736: 헌내기는 친구가 필요해 (0) | 2025.03.27 |
[백준] 7662: 이중 우선순위 큐 (0) | 2025.03.25 |