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

현지원님의 프로필 이미지
현지원

작성한 질문수

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

5. 쇠막대기

쇠막대기 풀이 질문

작성

·

206

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

답변 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() 체크 없이도 정상적으로 진행될 수 있습니다. 괄호 쌍의 올바르지 않은 입력에 대해서는 처리가 되어있지 않은 상태입니다.

현지원님의 프로필 이미지
현지원

작성한 질문수

질문하기