inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Giới thiệu về giải quyết vấn đề thuật toán Java: Chuẩn bị cho các bài kiểm tra mã hóa

5. Thanh kim loại

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

41

anstnwjd223586

1 câu hỏi đã được viết

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;
    }

}

java 코딩-테스트

Câu trả lời 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.
문크님, 질문해주신 peek() 메소드에 관련된 문제점을 살펴보겠습니다.

작성하신 코드를 보면 peek() 메소드를 사용해서 문이 제대로 돌아가지 못 하는 상황을 예상할 수 있습니다. 특정 조건에서 peek() 메소드를 사용하는 것이 문제를 야기하는 이유는 스택의 가장 위에 있는 요소만 확인할 수 있고, 그 요소를 제거하는 것이 아니기 때문입니다.

문제가 발생하는 두 번째 예시에서 peek() 메소드를 사용하고 나서 스택의 최상단 요소를 제거해야 하는 상황인데, 이게 잘못 관리될 경우 계산된 answer 값에 영향을 줄 수 있습니다.

기존의 선생님 풀이 방법에서는 두 번째 조건인 if(laser.charAt(i - 1) == '(')을 통해 이전 문자를 직접 확인하여 스택의 크기 또는 증가 값을 결정하고 있습니다. 두 번째 예시에서 είναι \'방출'이라는 로직이 필요할 경우에 이는 적절히 작동할 수 있습니다.

따라서 다음과 같은 방법으로 수정하여 확인할 필요가 있습니다.
1. peek()을 사용하기 전에는 스택이 비어있지 않은지 반드시 체크합니다.
2. peek()으로 확인 후에는 필요에 따라 스택에서 pop() 작업을 잊지 말고 수행합니다.

이 점들을 유의하시어 로직을 수정해 보시면 도움이 될 것 같습니다. 추가로, peek() 메소드보다 문자 비교 방식(charAt)을 활용해 보시면 보다 직관적인 코드를 작성할 수 있습니다.

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

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

봉우리 문제 질문입니다

0

70

2

씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?

0

57

0

이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?

0

65

0

가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법

0

63

1

좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ

0

77

2

6-7 강의에서

0

43

1

6-6. 장난꾸러기 질문 있습니다.

0

39

1

강의 수강후 코딩테스트

0

99

1

answer 변수 사용 여부

0

38

1

2중 for문

1

79

2

2-11. 임시반장정하기 (Runtime Error)

0

57

1

혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?

0

62

1

이런 풀이는 어떨까요

0

38

1

자바 스트림 방식의 효율성 질문 드립니다.

0

50

1

알고리즘 자료 구조들..

0

54

1

StringBuilder vs BufferdWriter

0

42

1

원더랜드(프림)

0

41

1

이런 코드는 어떤가요?

0

53

1

bfs 풀이

0

50

1

병합정렬

0

50

1

26강 임시반장 정하기에서 질문이 있습니다

0

36

1

이번달말에 완강 후 공부 방향

0

64

1

제가 이런 코테가 처음인데 공부방법을..ㅠ

1

102

1

20강 소수 에라토스테네스의 체 런타임 에러가 뜹니다

0

43

1