[백준][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