백준/Java

[백준 자바] 25497번(기술 연계마스터 임스)

gamzaggang7 2024. 6. 28. 20:23
728x90

실버 5

문제

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

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

임스가 사용할 수 있는 기술에는 1~9, 𝐿, 𝑅, 𝑆, 𝐾가 있다. 1~9는 연계 없이 사용할 수 있는 기술이고, 𝐿 𝑅의 사전 기술, 𝑆 𝐾의 사전 기술이다.

임스가 정해진 순서대로 𝑁개의 기술을 사용할 때, 기술이 몇 번이나 정상적으로 발동하는지를 구해보자.

단, 연계 기술은 사전 기술과 본 기술 모두 정상적으로 발동되었을 때만 하나의 기술이 발동된 것으로 친다.

입력

첫 번째 줄에는 총 기술 사용 횟수 𝑁이 주어진다. (1≤𝑁≤200000)

두 번째 줄에는 임스가 사용할 𝑁개의 기술이 공백 없이 주어진다.

출력

임스가 정상적으로 기술을 사용한 총 횟수를 출력한다.

 


 

728x90
  1. 기술을 문자열로 저장한다.
  2. 총 기술 사용 횟수와 L, S 사용 횟수를 카운트한다.
  3. 기술 문자열을 순회하여 각 문자를 검사한다
    1. 숫자인 경우 count를 즉시 증가시킨다.
    2. 'L'인 경우 Lcount를, 'R'인 경우 Rcount를 증가시킨다.
    3. 'R'인 경우 (또는 'K')
      1. Lcount가 0보다 크면(사전 기술을 했으면) Lcount를 감소시키고 총 기술 사용 횟수를 1 증가시킨다.
      2. Lcount가 0이면 사전 기술없이 본 기술을 사용했으므로 이후의 기술은 발동하지 않는다. 반복문을 종료시키고 count를 출력한다.
import java.io.*;

public class Main {
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    int N = Integer.parseInt(br.readLine());
    StringBuilder skills = new StringBuilder(br.readLine());

    int count = 0;
    int LRcount = 0, SKcount = 0;

    outerloop: for (int i = 0; i < N; i++) {
      char c = skills.charAt(i);

      if (Character.isDigit(c)) {
        count++;
      } else {
        switch (c) {
          case 'L':
            LRcount++;
            break;
          case 'R':
            if (LRcount > 0) {
              LRcount--;
              count++;
            } else
              break outerloop;
            break;
          case 'S':
            SKcount++;
            break;
          case 'K':
            if (SKcount > 0) {
              SKcount--;
              count++;
            } else
              break outerloop;
            break;
          default:
            break;
        }
      }
    }
    bw.write(String.valueOf(count));

    bw.flush();
    br.close();
    bw.close();
  }
}

 

728x90