Information Security Study
[백준] 10799: 쇠막대기 본문
입출력 예시다.
괄호가 바로 열고 닫히는 경우 레이저가 발사되며
그렇지 않은 경우에는 쇠막대기가 놓인다.
위 이미지를 자세히 보면
레이저가 발사되기 전의 괄호 갯수만큼 쇠막대기가 분할되는 것을 알 수 있다.
예를 들어 (((()의 경우 짝이 맞는 () 전에 존재하는 (의 갯수가 3개이고
쇠막대기도 마찬가지로 3개가 생성된다.
((()()의 경우
첫 번째 레이저가 발사되는 ()이전의 괄호 갯수는 3개,
두 번째 레이저가 발사되는 ()이전의 괄호 갯수도 3개이므로 총 6개의 쇠막대기가 생긴다.
레이저 발사 후 바로 )가 들어오는 경우에는 쇠막대기가 하나만 생성된다.
이를 코드로 작성하기 위해서는 스택을 사용하는 것이 용이하다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
// StringBuilder를 사용하여 결과를 한 번에 출력하기 위한 객체 생성
StringBuilder sb = new StringBuilder();
// BufferedReader를 사용하여 입력을 받기 위한 객체 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 괄호 문자열 입력 받기
String s = br.readLine();
// 결과 출력 및 쇠막대기 개수 계산
sb.append(solve(s)).append("\n");
// 결과 출력
System.out.println(sb);
}
// 괄호 문자열을 받아 쇠막대기의 개수를 계산하는 함수
public static String solve(String s) {
// 저장할 스택 생성
Stack<Character> stack = new Stack<>();
// 쇠막대기의 개수를 저장할 변수
int N = 0;
// 괄호 문자열을 순회하면서 쇠막대기의 개수 계산
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(') {
// 여는 괄호일 경우 스택에 push
stack.push(c);
} else if (c == ')') {
// 닫는 괄호일 경우 스택에서 pop
stack.pop();
// 바로 앞이 여는 괄호일 경우 현재 스택의 크기만큼 쇠막대기가 끝났음을 의미
if (s.charAt(i - 1) == '(') {
N += stack.size();
} else {
// 바로 앞이 닫는 괄호일 경우 현재 위치에 끝나는 쇠막대기 추가
N++;
}
} else {
// 괄호 이외의 문자가 들어온 경우 에러 메시지 반환
return "some error message";
}
}
// 계산된 쇠막대기의 개수 반환
return String.valueOf(N);
}
}
'Programming > JAVA' 카테고리의 다른 글
[백준] 1874: 스택 수열 (0) | 2024.01.22 |
---|---|
[백준] 3986: 좋은 단어 (0) | 2024.01.19 |
[백준] 9012: 괄호 (0) | 2024.01.19 |
[백준] 4949: 균형잡힌 세상 (0) | 2024.01.18 |
[백준] 10828: 스택 (0) | 2024.01.18 |