[백준] 5345 PLU Count (파이썬), 정규 표현식

파이썬/코딩테스트|2023. 11. 1. 09:00

https://www.acmicpc.net/problem/5345

 

5345번: PLU Count

Given a text string you must find the number of non-interleaved occurrences of PLU in the string. The letters P, L, U must occur in order, but capitalization is not important and the letters need not be consecutive. For example the string “pppxLLLxuuu”

www.acmicpc.net

구글 번역 + 검수

문제
텍스트 문자열이 주어지면 문자열에서 interleave(서로 겹치는)되지 않은 PLU 발생 횟수를 찾아야 합니다.
P, L, U 문자는 순서대로 나타나야 합니다.
대문자 사용은 중요하지 않으며 문자가 연속될 필요는 없습니다.
예를 들어 문자열 "pppxLLLxuuu"에는 interleave 되지 않은 PLU 항목이 하나만 있습니다.
(PLU를 찾은 뒤, 그 다음 문자에서 다시 PLU를 찾을 수 없습니다.
u를 최대한 이르게 찾더라도 뒤에 남은 문자는 'uu'뿐입니다.)

입력
입력의 첫 번째 줄은 뒤에 오는 텍스트 문자열의 수를 나타내는 양의 정수 n입니다.
양의 정수 다음에는 한 줄에 하나씩 n개의 텍스트 문자열이 옵니다.
각 텍스트 문자열은 최대 80자이며 빈 줄은 없습니다.

출력
각 텍스트 문자열에 대해 위에서 설명한 대로 인터리브되지 않은 PLU 발생의 최대 개수를 출력합니다.

 

# 반복문
def count_plu(string):
    count = 0
    prev_char = 'default'

    for s in string:
        if prev_char == 'default' and s == 'P':
            prev_char = 'P'
        elif prev_char == 'P' and s == 'L':
            prev_char = 'L'
        elif prev_char == 'L' and s == 'U':
            count += 1
            prev_char = 'default'
    return count

n = int(input())
for _ in range(n):
    string = input().upper()
    count = count_plu(string)
    print(count)

반복문으로 푼 방식. 조건을 만족하면 즉시 시행하도록 해서 최대한 U 글자를 빠르게 찾도록 하였다. 파이썬 string.upper()는 단일 문자가 아니라 복수 문자에서도 적용 가능하다.

 

# 정규표현식
import re

n = int(input())
for _ in range(n):
    strings = input()
    ans = re.findall('([pP]).*?([lL]).*?([uU])', strings)
    print(len(ans))

정규표현식으로 푼 방식. 익숙해진다면 가독성이 훨씬 좋다. re.findall을 통해 모든 패턴을 찾도록 하였다. 최대한 빠르게 찾는 것이 중요하기 때문에 중간의 .(모든 글자)*(0개 혹은 그 이상)에 ?, lazy operator를 붙여줬다. lazy가 붙으면 해당 조건을 만족하는 가장 빠른 경우의 수만 찾게 된다. findall은 모든 패턴을 찾기 때문에 PLU만 입력하면 되고 앞뒤로 추가로 .?을 붙일 필요가 없다.

댓글()