BoJ 25497 - 기술 연계마스터 임스 [with Python]

ssook·2023년 8월 26일
0

BoJ 문제기록

목록 보기
4/29
post-thumbnail

📍 문제

문제

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

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

임스가 사용할 수 있는 기술에는
1~9, LL, RR, SS, KK가 있다.
11~99는 연계 없이 사용할 수 있는 기술이고,
LLRR의 사전 기술, SSKK의 사전 기술이다.

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

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

입력

첫 번째 줄에는 총 기술 사용 횟수
NN이 주어진다. (1N2000001 \le N \le 200\,000)

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

출력

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

예제

  • 예제 입력
5
S12K2
  • 예제 출력
4
  • 예제 입력
4
1LKR
  • 예제 출력
1
  • 예제 입력
4
SSKK
  • 예제 출력
2

📍 아이디어 & 제출 코드

실패 코드

def count_successful_skills(N, skills):
    stack = []  
    count = 0   

    for skill in skills:
        if skill in "123456789":
            count += 1
        elif skill == "L":
            stack.append(skill)
        elif skill == "R":
            if stack and stack[-1] == "L":
                stack.pop()
                count += 1
            else:
                stack.append(skill) 
        elif skill == "S":
            stack.append(skill)
        elif skill == "K":
            if stack and stack[-1] == "S":
                stack.pop()  
                count += 1
            else:
                stack.append(skill)  

    return count

N = int(input())
skills = input().strip()

result = count_successful_skills(N, skills)
print(result)
  • 처음에는 스택을 전체 기술을 담는 한 개만 사용해서 진행했었다.
    그러다 보니 스택의 맨 위에 있는 사전 기술들이 필요없는 후속 기술들에게도 영향을 줘 버려서... 그래서 아래 같은 테스트 케이스를 통과하지 못했다.
4
LSRK

이 테스트 예제의 출력이 1이 아닌 0이 나온다면, 각각 연계 기술들을 따로 담는 스택 2개로 관리하는 것을 추천한다...

통과 코드

import sys

N = int(sys.stdin.readline().rstrip())
skills = sys.stdin.readline().rstrip()

lr_stack = []  
sk_stack = []  
count = 0      

for skill in skills:
    if skill in "123456789":
        count += 1
        
    elif skill == "L":
        lr_stack.append(skill)
    
    elif skill == "R":
        if lr_stack and lr_stack[-1] == "L":
            lr_stack.pop()  
            count += 1
        else:
            print(count)
            sys.exit() # 본 기술 실패 시 바로 종료
        
    elif skill == "S":
        sk_stack.append(skill)
    
    elif skill == "K":
        if sk_stack and sk_stack[-1] == "S":
            sk_stack.pop() 
            count += 1
            
        else:
            print(count)
            sys.exit()

print(count)  
  • 위에서 실패한 코드를 기반으로 스택을 각각 2개로 나누어서 관리한 코드.
profile
개발자에서, IT Business 담당자로. BrSE 업무를 수행하고 있습니다.

0개의 댓글