728x90
https://www.acmicpc.net/problem/13022
.... 광광
하 엄청난 삽질 후에 풀었다
반례를 빠르게 찾아내서 예외케이스를 처리해주는게 중요한 문자열 패턴 문제이다..
1. f를 기준으로 문자열을 잘라서 검사한다 ex) wolfwolf -> [wolf, wolf]
2. 자른 문자열의 w, o, l, f 알파벳 개수를 세서 각각 알파벳 개수가 동일한지 확인한다.
3. 동일하다면 정규표현식을 사용해서 w+o+l+f (w,o,l,f가 각각 한번 이상 등장하고 순서대로 등장하는지 확인)를 확인해준다.
4. 그런데 이렇게 했을 때 처리가 안되는 반례가 하나 있다 -> ex) wwoollffwol
f를 기준으로 잘랐을 때 wwoollff 까지만 짤리고 그 이후의 chunk에 대해서 확인 불가이므로, f로 끝나지 않는 경우 모두 false 를 return 해주어야 한다.
if wold[-1] != 'f' : return 0
딱히 유명한 문제도 아니고 맘에드는 (?) 풀이도 별로 안나오고 해서 직접 풀었는뎅
엣지테스트케이스를 처리해주어야 해서 삽질을 오래한 문제이다 ㅎㅎ..
전체 코드는 다음과 같다.
# 13022
import re
word = input()
flag = True
n = len(word)
pattern = re.compile("w+o+l+f+") # + 해당 패턴이 하나 이상
# 1. f를 기준으로 나누기
# 반례 : wwoollffwol
def check(word):
index = [-1]
if len(word) < 4:
return 0
if word[-1] != 'f':
return 0
for i in range(n):
if word[i] == 'f' and (i == n-1 or word[i+1] != 'f'):
index.append(i)
for i in range(len(index)-1):
if i != len(index)-1:
# chunk 는 맨 끝 f가 나올때마다 나눈 것임
chunk = word[index[i]+1:index[i+1]+1]
if chunk.count('w') == chunk.count('o') == chunk.count('l') == chunk.count('f'):
if pattern.match(word):
continue
else:
return 0
else:
return 0
return 1
print(check(word))
728x90
'Algorithm (PS)' 카테고리의 다른 글
[프로그래머스] 여행경로 Python (파이썬) (0) | 2022.11.09 |
---|---|
[백준] 15927 파이썬 - 회문은 회문아니야!! (0) | 2022.11.05 |
[백준] 2470 두 용액 파이썬 (0) | 2022.10.30 |
[백준] 2615 오목 Python (0) | 2022.10.27 |
[백준] 5972 택배배송 Python (0) | 2022.10.26 |