업데이트:

문제 링크

백준 25497번 - 기술 연계마스터 임스 (Silver 5)

문제 설명

주어진 순서대로 기술을 사용할 때, 기술이 정상적으로 발동하는 횟수를 출력하시오.
기술들의 정보는 아래와 같다.

  • 사용할 수 있는 기술로는 1 ~ 9, L, R, S, K가 있다.
  • 기술 1 ~ 9는 단독으로 사용할 수 있다.
  • L, R, S, K는 연계 기술로, 사전 기술과 본 기술을 순서대로 사용해야 발동한다.
  • 본 기술 R은 사전 기술 L이 사용된 상태여야만 발동 가능하다.
  • 본 기술 K는 사전 기술 S가 사용된 상태여야만 발동 가능하다.
  • 연계 기술을 적당한 사전 기술 없이 사용했다면, 이후의 기술들은 전부 발동이 불가능하다.
  • 사전 기술과 본 기술 사이에 다른 기술을 사용하는 것은 가능하다.

단, 연계 기술은 사전 기술과 본 기술 모두 발동했을 때 하나의 기술이 발동한 것으로 센다.

정답 코드 및 설명

기술 1 ~ 9는 단순 카운팅이고, 연계 기술이 핵심이다.
연계 기술이 꼬이지 않고 발동하려면 사전 기술이 먼저 사용된 상태여야 한다.
각 시점마다 본 기술과 연계되지 않은 사전 기술의 횟수를 저장해두면 이를 해결할 수 있다.

예를 들어보자. 기술을 쓰려는 순서가 LLRLRR이라고 하자.

  1. i = 0일 때, 본 기술 R과 연계되지 않은 사전 기술 L의 횟수 countL = 1이다.
  2. i = 1일 때는 countL = 2이다.
  3. i = 2일 때, 본 기술 R이 발동했다. 전체 기술 발동 횟수는 1이고, countL = 1이다.
  4. i = 3일 때, countL = 2이다.
  5. i = 4일 때, 본 기술 R이 발동했다. 전체 기술 발동 횟수는 2이고, countL = 1이다.
  6. i = 5일 때, 본 기술 R이 발동했다. 전체 기술 발동 횟수는 3이고, countL = 0이다.

기술이 꼬이는 경우는 연계되지 않은 사전 기술의 횟수가 0인데 본 기술을 발동하려고 시도하는 경우에 해당한다. 코드의 16 ~ 30행이 연계 기술을 처리하는 부분에 해당한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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 command = br.readLine();
        int count = 0;
        int countL = 0, countS = 0;
        for (int i = 0; i < n; i++) {
            char curr = command.charAt(i);
            if (curr >= '1' && curr <= '9') count++;
            else if (curr == 'L') countL++;
            else if (curr == 'S') countS++;
            else if (curr == 'R') {
                if (countL > 0) {
                    count++;
                    countL--;
                }
                else break;
            } else if (curr == 'K') {
                if (countS > 0) {
                    count++;
                    countS--;
                }
                else break;
            }
        }
        System.out.println(count);
    }
}

댓글남기기