쇠막대기 풀이 질문
272
작성한 질문수 14
안녕하세요,
첫번째 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() 체크 없이도 정상적으로 진행될 수 있습니다. 괄호 쌍의 올바르지 않은 입력에 대해서는 처리가 되어있지 않은 상태입니다.
안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.
0
27
1
갑자기 채점 사이트가 바뀌었어요
0
32
1
문제 리스트 페이지
0
27
1
채점 사이트 관련 질문드립니다
0
23
1
봉우리 문제 질문입니다
0
81
2
씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?
0
64
0
이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?
0
72
0
가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법
0
67
1
좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ
0
85
2
6-7 강의에서
0
48
1
6-6. 장난꾸러기 질문 있습니다.
0
45
1
강의 수강후 코딩테스트
0
109
1
answer 변수 사용 여부
0
44
1
2중 for문
1
85
2
2-11. 임시반장정하기 (Runtime Error)
0
63
1
혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?
0
70
1
이런 풀이는 어떨까요
0
43
1
자바 스트림 방식의 효율성 질문 드립니다.
0
57
1
알고리즘 자료 구조들..
0
62
1
StringBuilder vs BufferdWriter
0
47
1
원더랜드(프림)
0
50
1
이런 코드는 어떤가요?
0
61
1
bfs 풀이
0
57
1
병합정렬
0
56
1





