10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net

[문제 간단 설명]
(()())((()())) 입력이 이런식으로 주어진다.
이 입력에는 레이저와 쇠막대기에 대한 내용이 포함되어있다.
레이저는 () 열자마자 바로 닫히는 괄호.
쇠막대기는 그 외의 괄호들.
레이저가 쇠막대기를 자를때,
남은 쇠막대기들의 개수를 구하는 문제다.
고민하다가 도저히 어떻게 구현해야할지 모르겠어서
다른 사람의 풀이를 참고했다.
[풀이]
Stack을 이용.
'(' 는 스택에 추가.
')' 는 스택에서 하나 제거하고, 두가지 경우가 존재.
case 1ㅣ ')' 전에 나온 문자가 '(' 인 경우
-> result += 스택의 크기.
case 2 ㅣ ')' 전에 나온 문자가 ')' 인 경우
-> result += 1
case 1은 레이저를 의미한다.
레이저가 자르면,
막대기들의 갯수만큼 새로운 막대기들이 생긴다.
스택의 크기가 현재 있는 막대기들의 갯수이므로
result += 스택의 크기.
case 2는 막대기의 끝을 의미한다.
이미 레이저에 의해 잘린 막대기들의 갯수는 구했다.
막대기 끝에는 잘리고 남은 나머지 하나가 있을 것이므로
result += 1
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
Scanner sc = new Scanner(System.in);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Stack<Character> stk = new Stack();
int result = 0;
String str = sc.next();
for(int i =0; i < str.length(); i++){
char oneChar = str.charAt(i);
if(oneChar == '(')
stk.push(oneChar);
else{
stk.pop();
if(str.charAt(i-1) == '(') result += stk.size();
else result += 1;
}
}
bw.write(String.valueOf(result));
bw.flush();
bw.close();
}
}
|
cs |
'알고리즘 > 백준' 카테고리의 다른 글
| 백준 17299 오등큰수 자바[java] (0) | 2023.01.04 |
|---|---|
| 백준 17298 오큰수 자바[java] (0) | 2023.01.04 |
| 백준 17413 단어뒤집기 2 자바[java] (0) | 2023.01.03 |
| 백준 10866 덱 자바[java] (0) | 2023.01.02 |
| 백준 1158 요세푸스 자바[java] (0) | 2023.01.02 |