문제
문제해결1
import java.util.Scanner;
public class B10799 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
int n = 0;//놓여진 쇠막대기 개수
int cnt = 0;//총 쇠막대기 개수
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i)=='('){//여는 괄호일때
if (input.charAt(i+1)!=')'){//레이저가 아닐때
n++;//놓여진 쇠막대기 +1
cnt++;//총 쇠막대기 +1
} else {//바로 닫는 괄호를 만나면 레이저
cnt += n;//놓여진 쇠막대기 만큼 +
i++;//다음 괄호 스킵
}
} else {//닫는 괄호 일때
n--;//놓여진 쇠막대기 하나가 치워지는걸 의미
}
}
System.out.println(cnt);
}
}
- () : 레이저, 놓여진 쇠막대기 만큼 cnt에 추가
- ( : 놓여진 쇠막대기 하나 추가, cnt에도 하나 추가
- ) : 놓여진 쇠막대기 하나 빼기
- 문자열 하나하나 반복문으로 돌면서 조건에 맞는 처리를 해주면 된다
문제해결2 - stack 사용
import java.util.Scanner;
import java.util.Stack;
public class B10799_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
Stack<Character> stack = new Stack<>();//놓여진 쇠막대기 개수
int cnt = 0;//총 쇠막대기 개수
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i)=='('){//여는 괄호일때 쇠막대기 추가
stack.push('(');
} else {//닫는 괄호일때
stack.pop();//우선 하나 꺼냄
if (input.charAt(i-1)=='(')//레이저일때
cnt += stack.size();//쇠막대기 만큼 추가
else//그냥 닫는 괄호일때
cnt++;//총 개수 +1
}
}
System.out.println(cnt);
}
}
- 스텍을 사용해서도 문제를 풀 수 있다
- ( 일때는 무조건 stack에 push
- ) 일때
1. 그 전께 ( 일 경우 레이저 이므로 스텍 개수만큼 cnt에 추가
2. ( 가 아닐 경우 그냥 닫는 괄호이므로 놓여진 쇠막대기 하나 치우고 cnt +1
'[알고리즘] > 백준' 카테고리의 다른 글
백준 17299 자바 - 오등큰수 (0) | 2021.06.21 |
---|---|
백준 17298 자바 - 오큰수 (0) | 2021.06.20 |
백준 17413 자바 - 단어 뒤집기2 (0) | 2021.06.18 |
백준 10866 자바 - 덱 (0) | 2021.06.18 |
백준 1158 자바 - 요세푸스 문제 (0) | 2021.06.17 |