문제풀이/일일연습문제

[스택/큐]99클럽 코테 스터디 17일차 TIL + 백준/Silver/25497. 기술 연계마스터 임스

Mo_bi!e 2024. 11. 14. 09:21

기술 연계마스터 임스 - 문제 25497

문제 링크

성능 요약

메모리: 33464 KB, 시간: 864 ms

분류

자료 구조, 구현, 스택

제출 일자

2024년 11월 14일 09:15:42

문제 설명

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

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

임스가 사용할 수 있는 기술에는 1~9, L, R, S, K가 있다. 1~9는 연계 없이 사용할 수 있는 기술이고, L은 R의 사전 기술, S는 K의 사전 기술이다.

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

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

입력

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

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

출력

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

 

 

<내 코드>

import sys

N = int(sys.stdin.readline())
count = 0

values = list(sys.stdin.readline())
# has_L = False
# has_S = False
buffer = []
i = 0
while i < N :
    value = values[i]

    if value in "123456789":
        count += 1
    elif value in "LS":
        buffer.append(value)
    elif value == "R":
        if "L" in buffer:
            buffer.remove("L")
            count += 1
        else:
            break
    elif value == "K":
        if "S" in buffer:
            buffer.remove("S")
            count += 1
        else:
            break
    else :
        break
    i += 1

sys.stdout.write(str(count))

- 문제 조건에서 " 게임의 스크립트가 꼬여서 이후 사용하는 기술들이 정상적으로 발동되지 않는다 " 이 내용

을 간과했음 이 조건이 있으면 break 를 써야하는것을 이해하게됨

 

- 문자열은 특별히 리스트에 넣을필요없이 곧바로 문자열자체로 조건문 판별이 가능함

 

 

<모범사례>

import sys

def main():
    import sys
    N = int(sys.stdin.readline())
    skills = sys.stdin.readline().strip()
    
    count = 0
    buffer = []
    
    for i in range(N):
        skill = skills[i]
        
        if skill in "123456789":
            # Regular skills that can be used independently
            count += 1
        elif skill in "LS":
            # Prerequisite skills for combo skills
            buffer.append(skill)
        elif skill == "R":
            # Combo skill R requires L
            if "L" in buffer:
                buffer.remove("L")
                count += 1
            else:
                # Script gets messed up; stop processing further skills
                break
        elif skill == "K":
            # Combo skill K requires S
            if "S" in buffer:
                buffer.remove("S")
                count += 1
            else:
                # Script gets messed up; stop processing further skills
                break
        else:
            # Invalid skill; stop processing
            break

    print(count)

if __name__ == "__main__":
    main()

- 크게 내가 참고한 코드와 다른것은 없음

 

 

<보충학습>

- 문제를 잘 읽자!