[99클럽 17일차] [백준] 25497 기술 연계 마스터 임스

Dev.Dana·2024년 11월 14일
0

Algorithm

목록 보기
14/25
post-thumbnail

임스 이 녀석 연계 기술하는거 짜증난다… 하나의 스택에 쌓아서 처리하려고 했는데 5번 실패하고 작성하는 글..

여태 하나의 스택으로 본기술과 사전기술들을 담아서 페어를 맞추려고 했는데... 그게 잘못된거였다.
페어당 하나의 스택으로 구현해야한다.
왜? LKR 이런것도 L-R로 출력값이 1이 나와야한다. 한 스택에 모든 기술들을 넣고 짝을 맞추려고 하면 LKR와 같은 경우는 해결하기 힘들다.

문제분석

오늘의 문제는 기술 연계 마스터 임스가 하는 기술의 수를 세는 것이다. 문제의 조건은 다음과 같다.

  • 연계 기술: 두 개의 개별 기술을 순서대로 사용해야 정상적으로 발동되는 기술
  • 사전 기술: 본 기술 앞에 반드시 사용되어야만 발동 가능한 기술
    • L과 R은 연계 관계에 있습니다. (L은 R의 사전 기술)
    • S와 K는 연계 관계에 있습니다. (S는 K의 사전 기술)
  • 게임 내에서 기술들은 1~9, L, R, S, K로 이루어져 있습니다.
  • 독립 기술: 1~9는 연계 없이 바로 사용할 수 있습니다.

임스가 정해진 순서대로 N개의 기술을 사용할 때, 정상적으로 발동된 기술의 총 횟수를 구하는 것이 목표 !

접근 방식

사전 기술 - 본 기술 페어가 맞춰 졌을 때 정상적으로 기술을 사용했다고 체크하므로 Stack을 사용해서 문제를 풀 생각이다.

  1. L과 S가 등장하면 R과 K가 나올 때까지 스택에 쌓아둔다.
  2. R이나 K가 등장할 때 스택에 사전 기술이 있는지 확인한다.
    1. 맞는 사전기술이 있는 경우 스택에서 제거해서 정상 발동 처리를 한다.
    2. 사전기술이 없는 경우, 이후 기술 연계가 불가능한 상태이니 for문에서 break;한다.

코드 확인하기

import java.io.*;
import java.util.Stack;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(bf.readLine());
        String str = bf.readLine();

        Stack<Character> sStack = new Stack<>();
        Stack<Character> lStack = new Stack<>();
        int result = 0;

        for (int i = 0; i < n; i++) {
            char x = str.charAt(i);
            
            if (Character.isDigit(x)) {  // 독립적으로 사용할 수 있는 숫자 기술
                result++;
            } else if (x == 'L') {  // 'L'을 사전 기술로 준비
                lStack.add(x);
            } else if (x == 'S') {  // 'S'를 사전 기술로 준비
                sStack.add(x);
            } else if (x == 'R') {  // 본 기술 'R'을 사용하려면 'L' 필요
                if (!lStack.isEmpty()) {
                    lStack.pop();  // 사전 기술 'L' 사용
                    result++;
                } else {
                    break;  // 사전 기술이 없으면 이후 발동 실패
                }
            } else if (x == 'K') {  // 본 기술 'K'를 사용하려면 'S' 필요
                if (!sStack.isEmpty()) {
                    sStack.pop();  // 사전 기술 'S' 사용
                    result++;
                } else {
                    break;  // 사전 기술이 없으면 이후 발동 실패
                }
            }
        }
        System.out.println(result);
    }
}
  1. 숫자 기술 발동
    • 1~9는 사전 기술 없이 독립적으로 발동이 가능하기 때문에 등장할 때마다 result++;
  2. 사전 기술 준비
    • L이 등장하면 lStack에 추가
    • S가 등장하면 sStack에 추가
  3. 본 기술 연계
    • R이 나올 때, lStack이 비어 있지 않으면 L-R이 완성되므로 스택에서 L을 제거하고 result++;
    • K가 나올 때, sStack이 비어 있지 않으면 S-K가 완성되므로 스택에서 S를 제거하고 result++;
    • 만약 사전 기술이 없는 상태에서 본 기술이 등장할 경우 기술 발동 불가능 ⇒ 루프를 종료 !

핵심포인트

  • L스택과 S스택을 별도로 관리해서 연계에 맞는 본 기술이 나올 때 쉽게 페어를 만들어 기술을 발동시킬 수 있다.
  • 사전 기술이 없는데 본 기술이 나오는 경우, 이후 등장을 실패로 처리해서 루프 종료한다.
profile
어제의 나보단 나은 오늘의 내가 되기를

0개의 댓글