[백준] 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만 입력하면 되고 앞뒤로 추가로 .?을 붙일 필요가 없다.
'파이썬 > 코딩테스트' 카테고리의 다른 글
[백준] 19818 LaTeX Expert (파이썬), 정규 표현식 (0) | 2023.11.04 |
---|---|
[백준] 15482 한글 LCS (파이썬) (0) | 2023.11.02 |
[백준] 22973 점프 숨바꼭질 (파이썬) (0) | 2023.10.19 |
[백준] 1987 알파벳 (파이썬), 시간 초과 해결하는 법 (0) | 2023.10.14 |
[백준] 13549 숨바꼭질 3 (파이썬), 가중치와 탐색 순서 (0) | 2023.09.22 |
댓글()