https://www.acmicpc.net/problem/10799
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net
입력받은 문자열을 돌면서 '('가 나오면 스택에 쌓고, ')'이 나오면 스택에서 하나 꺼낸 뒤 남은 스택의 크기를 더해가면 해결할 수 있다. 단, ')'가 연속으로 나올 경우 남은 스택의 크기가 아닌 1만 더해줘야 한다. ')'가 연속으로 나왔다는 것은 다 잘린 막대기가 있다는 것이고 그것은 1개이기 때문이다.
덜 잘려 남은 막대가 있다고 하더라도 다음 레이저에서 그 개수가 더해지기 때문에 ')'가 연속으로 나오면 1만 더해주면 된다.
import java.util.*;
import java.io.*;
class No10799 {
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
Stack<Character> s = new Stack();
int count = 0;
// 연속으로 ')'가 나오는지 체크. 연속으로 나오면 true
boolean flag = false;
for (int i=0; i<input.length(); i++) {
if (input.charAt(i)=='(') {
flag = false;
s.add(input.charAt(i));
} else {
if (flag) { // ')'가 연속으로 나왔다면, 다 잘린 막대가 있음
s.pop();
count ++; // 막대 끝부분은 1개
} else {
s.pop();
count += s.size();
}
flag = true;
}
}
System.out.println(count);
}
}
'알고리즘 > Java' 카테고리의 다른 글
[백준] 17299번 오등큰수 (0) | 2023.04.09 |
---|---|
[백준] 17413 단어 뒤집기 2 (0) | 2023.04.07 |
[프로그래머스] 최대공약수와 최소공배수 (0) | 2023.03.25 |
[백준] 1193번 분수찾기 (0) | 2023.02.11 |