순간을 기록으로

[JAVA] 쇠막대기 본문

Problem Solving

[JAVA] 쇠막대기

luminous13 2022. 1. 11. 15:04

문제

 

풀이

괄호가 등장하는 걸로보아 Stack을 이용한 문제로 예상하고 문제를 이해하면 stack을 사용하는게 확실해 진다.

stack의 괄호문제는 대부분 닫는 괄호 ')'일 때 액션을 취해주면 된다. 여기서는 ')'일 때 액션을 2가지로 나눌 수 있다.

첫 번째로 ')' 바로 앞이 '('이 나왔다면 레이저를 의미하므로 stack에 넣었던 것을 pop해주고 갯수를 더해준다. 두 번째로 ')'는 막대기 끝 부분이므로 스택에 쌓인 막대기 하나를 제거하고 갯수를 1더해주면 된다.

 

 

코드

import java.util.Scanner;
import java.util.Stack;

public class Main {

    public int solution(String str) {
        int answer = 0;
        Stack<Character> stack = new Stack<>();

        int len = str.length();
        char ch;
        for (int i=0; i<len; i++) {
            ch = str.charAt(i);
            if (ch == '(')  // 막대기 시작부분 이면
                stack.push(ch);
            else {
                if (str.charAt(i-1) == '(') {   // 레이저이면
                    stack.pop();
                    answer += stack.size();
                }
                else {  // 막대기 끝이면
                    stack.pop();
                    answer +=1;
                }
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String str = in.next();
        System.out.println(T.solution(str));
    }
}

 

느낀점

처음에 그냥 대충 감으로 문제를 풀어서 정확한 답이 안나왔다. 확실하게 논리적으로 구성한다음에 확실할 때 구현해야겠다.

'Problem Solving' 카테고리의 다른 글

[Java] 연속된 자연수의 합  (0) 2022.01.12
[JAVA] 신규 아이디 추천  (0) 2022.01.12
[JAVA] K번째큰수  (0) 2022.01.11
[JAVA] 연속 부분수열  (0) 2022.01.11
[JAVA] 피보나치 수열  (0) 2022.01.10
Comments