inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

5. 쇠막대기

쇠막대기 풀이 질문

272

현지원

작성한 질문수 14

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

java 코딩-테스트

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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