작성
·
206
0
안녕하세요,
첫번째 else 문에서 바로 pop을 해줘도 오류가 나지 않는 이유, 두번째 if문에서 stack.isEmpty() 체크를 해주지 않는 이유가
무조건 처음 한번은 '(' 괄호가 들어가기 때문인가요?
for (int i = 0; i < arr.length; i++) {
if (arr[i] == '(')
stack.push(arr[i]);
else {
stack.pop();
if (arr[i - 1] == '(')
answer += stack.size();
else
answer++;
}
}
import java.util.*;
public class Main {
public int solution(String str) {
int answer = 0;
Stack<Character> stack = new Stack<>();
char[] arr = str.toCharArray();
for (int i = 0; i < arr.length; i++) {
if (arr[i] == '(')
stack.push(arr[i]);
else {
stack.pop();
if (arr[i - 1] == '(')
answer += stack.size();
else
answer++;
}
}
return answer;
}
public static void main(String[] args) throws Exception {
Main T = new Main();
Scanner kb = new Scanner(System.in);
String str = kb.next();
System.out.println(T.solution(str));
}
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
주어진 코드는 쇠막대기 문제를 푸는 알고리즘의 일부로 보입니다. 여러분의 질문에 답변드리겠습니다.
첫 번째 else
문에서 stack.pop()
을 바로 호출해도 오류가 나지 않는 이유는 항상 ‘(’, ‘)’ 괄호 쌍이 맞게 입력되기 때문입니다. 즉, ‘()’ 괄호 쌍이 올바르게 주어졌다면, stack.pop()
을 호출했을 때 Stack
이 비어있지 않아 오류가 발생하지 않습니다.
두 번째 if
문에서 stack.isEmpty()
를 확인하지 않는 이유도 각 ‘(’ 괄호에 해당하는 ‘)’ 괄호가 반드시 주어지므로 Stack
이 비어있을 가능성이 없기 때문입니다. 만약 ‘)’ 괄호가 더 많이 주어져서 stack.pop()
이 호출될 때 Stack
이 비어있다면, 그것은 주어진 문자열이 올바른 괄호 쌍이 아니라는 것을 의미하며, 이 경우 알고리즘의 가정에 어긋난 입력이 주어진 것입니다.
위의 코드는 ‘(’ 괄호를 만나면 stack.push()
를 하여 Stack
에 추가하고, ‘)’ 괄호를 만나면 쇠막대기의 끝이거나 레이저임을 판단합니다. 만약 직전 문자가 ‘(’ 괄호였다면, 즉 arr[i - 1] == '('
라면 레이저이므로 현재 Stack
의 크기만큼 값을 더하고, 그렇지 않다면 쇠막대기의 끝 점에 도달했으므로 answer++
을 합니다.
질문하신 내용은 알고리즘이 올바른 괄호 쌍이 들어올 것이라는 가정하에 설계되었기 때문에 isEmpty()
체크 없이도 정상적으로 진행될 수 있습니다. 괄호 쌍의 올바르지 않은 입력에 대해서는 처리가 되어있지 않은 상태입니다.