작성
·
27
0
이전 글에 같은 내용의 질문을 확인했는데 해당 글에 다른 분이 댓글다신거 확인하고도 의문이 안풀려서요.
저는 peek() 메소드를 사용해서 코드를 작성했는데 첫번째 예시에 대한 답은 잘나오는데 두번째 예시의 답이 24가 아닌 26으로 나옵니다.
왜 26이 나오는지 도저히 모르겠어요..
혹시 peek() 메소드로는 해당 문제풀이가 힘든걸까요?
import java.util.Scanner;
import java.util.Stack;
public class IronRod {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String laser = scanner.next();
System.out.println(solution(laser));
}
private static int solution(String laser) {
int answer = 0;
Stack<Character> stack = new Stack<>();
// 선생님 풀이
for(int i = 0; i < laser.length(); i++){
if(laser.charAt(i) == '('){
stack.push('(');
} else {
stack.pop();
if(laser.charAt(i - 1) == '('){
answer += stack.size();
} else {
answer++;
}
}
}
// 제가 작성한 코드
for(char c : laser.toCharArray()){
if(c == '('){
stack.push(c);
} else {
if(stack.peek() == '('){
stack.pop();
answer += stack.size();
} else {
stack.pop();
answer++;
}
}
}
return answer;
}
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
문크님, 질문해주신 peek() 메소드에 관련된 문제점을 살펴보겠습니다.
작성하신 코드를 보면 peek()
메소드를 사용해서 문이 제대로 돌아가지 못 하는 상황을 예상할 수 있습니다. 특정 조건에서 peek()
메소드를 사용하는 것이 문제를 야기하는 이유는 스택의 가장 위에 있는 요소만 확인할 수 있고, 그 요소를 제거하는 것이 아니기 때문입니다.
문제가 발생하는 두 번째 예시에서 peek()
메소드를 사용하고 나서 스택의 최상단 요소를 제거해야 하는 상황인데, 이게 잘못 관리될 경우 계산된 answer
값에 영향을 줄 수 있습니다.
기존의 선생님 풀이 방법에서는 두 번째 조건인 if(laser.charAt(i - 1) == '(')
을 통해 이전 문자를 직접 확인하여 스택의 크기 또는 증가 값을 결정하고 있습니다. 두 번째 예시에서 είναι \'방출'
이라는 로직이 필요할 경우에 이는 적절히 작동할 수 있습니다.
따라서 다음과 같은 방법으로 수정하여 확인할 필요가 있습니다.
1. peek()
을 사용하기 전에는 스택이 비어있지 않은지 반드시 체크합니다.
2. peek()
으로 확인 후에는 필요에 따라 스택에서 pop()
작업을 잊지 말고 수행합니다.
이 점들을 유의하시어 로직을 수정해 보시면 도움이 될 것 같습니다. 추가로, peek()
메소드보다 문자 비교 방식(charAt
)을 활용해 보시면 보다 직관적인 코드를 작성할 수 있습니다.
추가적인 참고자료가 필요하시면 아래의 이미지를 참고해 주세요:
-
아무쪼록 문제를 해결하시는데 조금이나마 도움이 되셨길 바랍니다!