반응형

여러 길이의 막대기를 여러 개 입력 받아 레이저로 잘랐을 때, 최종적으로 몇 개의 막대기가 생기는지 묻는 문제이다.
처음에 문제만 읽었을 땐 진짜 완전 어려워 보였는데… 막상 생각을 좀 하니 알고리즘이 슉슉 떠오르던 생각보다 쉬운 문제였다…!
어떻게 풀었냐??! 그건 아래의 코드에 주석을 다 달아놨으니 코드를 보십셔!
import java.io.*;
import java.util.Stack;
import java.util.Queue;
import java.util.LinkedList;
public class IronStick_10799 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Stack<Integer> stack = new Stack<>();
int cnt = 0;
String str = br.readLine();
for (int i=0; i<str.length()-1; i++) {
char c = str.charAt(i);
if (c == '(') { // '('의 경우
if (str.charAt(i+1) == ')') { // 레이저의 경우에는 스택에 넣으면 안 됨!
cnt += stack.size(); // 지금 있는 막대기를 자르는 거니까 그만큼 ++한다
i++; // 직후의 ')'는 스킵
} else { // 레이저가 아니라 진짜 막대기의 시작점일 경우
stack.push((int)str.charAt(i)); // 막대기가 시작됨
}
} else { // '('의 경우
if (!stack.isEmpty()) { // 막대기가 존재한다면
stack.pop(); // 막대기를 자른다
cnt++; // 막대기가 잘리므로 막대기의 수가 하나 늘어남
}
}
}
// 위 for문에서는 맨 마지막 char을 검사하지 않았으므로 이제 검사해줌
if (str.charAt(str.length()-2) == ')' && str.charAt(str.length()-1) == ')') {
cnt++; // 맨 마지막이 ')'이며 레이저가 아닌 경우 막대기가 끝나므로 막대기의 수를 1개 올려줌
}
bw.write(Integer.toString(cnt));
bw.close();
br.close();
}
}
로그인
www.acmicpc.net
작성일자: 2023-09-03
'컴퓨터 공학 > 백준' 카테고리의 다른 글
[백준] JAVA 자바 : 오등큰수 (17299번) (0) | 2024.01.20 |
---|---|
[백준] JAVA 자바 : 오큰수 (17298번) (0) | 2024.01.20 |
[백준] JAVA 자바 : 단어 뒤집기 2 (17413번) (0) | 2024.01.20 |
[백준] JAVA 자바 : 덱 (10866번) (0) | 2024.01.20 |
[백준] JAVA 자바 : 요세푸스 문제 (1158번) (0) | 2024.01.20 |