Algorithm (PS)

[백준] 13022 : 늑대와 올바른 단어 Python/파이썬 풀이

minjiwoo 2022. 11. 4. 15:13
728x90

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

 

13022번: 늑대와 올바른 단어

첫째 줄에 단어가 주어진다. 단어는 w, o, l, f로만 이루어져 있으며, 길이는 50을 넘지 않는다.

www.acmicpc.net

.... 광광 

 

하 엄청난 삽질 후에 풀었다 

반례를 빠르게 찾아내서 예외케이스를 처리해주는게 중요한 문자열 패턴 문제이다.. 

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