강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

문크님의 프로필 이미지
문크

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

5. 쇠막대기

peek() 메소드 사용한 문제풀이

작성

·

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)을 활용해 보시면 보다 직관적인 코드를 작성할 수 있습니다.

추가적인 참고자료가 필요하시면 아래의 이미지를 참고해 주세요:
- 수강확인증 발급 이미지

아무쪼록 문제를 해결하시는데 조금이나마 도움이 되셨길 바랍니다!

문크님의 프로필 이미지
문크

작성한 질문수

질문하기