[ 문제 ]
임스는 연계 기술을 사용하는 게임을 플레이 중에 있다. 연계 기술은 사전 기술과 본 기술의 두 개의 개별 기술을 순서대로 사용해야만 정상적으로 사용 가능한 기술을 말한다.
하나의 사전 기술은 하나의 본 기술과만 연계해서 사용할 수 있으며, 연계할 사전 기술 없이 본 기술을 사용했을 경우에는 게임의 스크립트가 꼬여서 이후 사용하는 기술들이 정상적으로 발동되지 않는다. 그렇지만 반드시 사전 기술을 사용한 직후에 본 기술을 사용할 필요는 없으며, 중간에 다른 기술을 사용하여도 연계는 정상적으로 이루어진다.
임스가 사용할 수 있는 기술에는 1~9, L, R, S, K가 있다.
1~9는 연계 없이 사용할 수 있는 기술이고, L은 R의 사전 기술, S은 K의 사전 기술이다.
임스가 정해진 순서대로 N개의 기술을 사용할 때, 기술이 몇 번이나 정상적으로 발동하는지를 구해보자.
단, 연계 기술은 사전 기술과 본 기술 모두 정상적으로 발동되었을 때만 하나의 기술이 발동된 것으로 친다.
[ 입력 ]
첫 번째 줄에는 총 기술 사용 횟수 N이 주어진다. (1 <= N <= 200,000)
두 번째 줄에는 임스가 사용할 N개의 기술이 공백 없이 주어진다.
[ 출력 ]
임스가 정상적으로 기술을 사용한 총 횟수를 출력한다.
[ 핵심 ]
1. L과 R에 대한 스택 s1, S와 K에 대한 스택 s2로 나누기
2. 사전기술인 경우 각각의 스택에 push
3. 본기술인 경우 스택이 비어있지 않다면 count 증가, pop()
4. 숫자인 경우 단순히 count 증가
[ 풀이 ]
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 IOException{
// 입력을 받기 위함
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 문자 개수
int N = Integer.parseInt(br.readLine());
// 문자 입력받기
String str = br.readLine();
// L과 R에 대한 스택
Stack<Character> s1 = new Stack<>();
// S와 K에 대한 스택
Stack<Character> s2 = new Stack<>();
// 스킬을 사용한 횟수
int count = 0;
// 문자 개수만큼 반복
for (int i = 0; i < N; i++) {
char c = str.charAt(i);
// 사전기술 L 인 경우
if (c == 'L') {
s1.push(c);
}
// 사전기술 S 인 경우
else if (c == 'S') {
s2.push(c);
}
// 본기술 K인 경우
else if (c == 'K') {
if (!s2.isEmpty()) {
count++;
s2.pop();
}
else { break; }
}
// 본기술 R인 경우
else if (c == 'R') {
if (!s1.isEmpty()) {
count++;
s1.pop();
}
else { break; }
}
// 숫자인 경우
else { count++; }
}
System.out.println(count);
}
}