[백준][10799번] 쇠막대기

Updated:

내가 푼 코드

package backjoon;

import java.util.*;

public class Main {
    public static class Bar {
        int start;
        int end;
        int count;

        public Bar(int start) {
            this.start = start;
            end = 0;
            this.count = 0;
        }

        public void increaseCount() {
            this.count++;
        }

        public void setEnd(int end) {
            this.end = end;
        }
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String arrangement = sc.nextLine();
        int answer = 0;
        String[] arrange = arrangement.split("()");
        Stack<String> st = new Stack<>();
        Stack<Bar> ready = new Stack<>();  // '('을 저장할 임시 stack
        List<Bar> finish = new LinkedList<>();

        for (int i = arrange.length - 1; i >= 0; i--) {
            st.add(arrange[i]);
        }

        for (int i = 0; i < arrange.length || !st.isEmpty(); i++) {
            String str = st.pop();
            if (str.equals("(")) {
                if (st.peek()!= null && st.peek().equals(")")) {
                    ready.forEach(Bar::increaseCount);
                    st.pop();
                    i++;
                } else {
                    ready.add(new Bar(i));
                }
            } else {
                Bar bar = ready.pop();
                bar.setEnd(i);
                finish.add(bar);
            }
        }

        for(Bar bar : finish){
            answer += bar.count+1;
        }

        System.out.println(answer);
    }
}

다른 풀이

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        String a = sc.nextLine().trim();
        int n = a.length();
        Stack<Integer> s = new Stack<Integer>();
        int ans = 0;
        for (int i=0; i<n; i++) {
            char c = a.charAt(i);
            if (c == '(') {
                s.push(i);
            } else {
                if (s.peek()+1 == i) {
                    s.pop();
                    ans += s.size();
                } else {
                    s.pop();
                    ans += 1;
                }
            }
        }
        System.out.println(ans);
    }
}

느낀점

다른사람의 풀이는 stack에 인덱스 자체를 넣고 비교하는 다. 내가 했던 방법보다 길이, 속도면에서 훨씬 효율적이다.

Leave a comment