25497번: 기술 연계마스터 임스

Minseo Kang·2023년 4월 16일
0

백준

목록 보기
10/13
post-thumbnail

[ 문제 ]
임스는 연계 기술을 사용하는 게임을 플레이 중에 있다. 연계 기술은 사전 기술과 본 기술의 두 개의 개별 기술을 순서대로 사용해야만 정상적으로 사용 가능한 기술을 말한다.

하나의 사전 기술은 하나의 본 기술과만 연계해서 사용할 수 있으며, 연계할 사전 기술 없이 본 기술을 사용했을 경우에는 게임의 스크립트가 꼬여서 이후 사용하는 기술들이 정상적으로 발동되지 않는다. 그렇지만 반드시 사전 기술을 사용한 직후에 본 기술을 사용할 필요는 없으며, 중간에 다른 기술을 사용하여도 연계는 정상적으로 이루어진다.

임스가 사용할 수 있는 기술에는 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);
    }
}

0개의 댓글