[Python] 백준 13022 늑대와 올바른 단어 (String)

선주·2022년 1월 24일
0

Python PS

목록 보기
32/65
post-thumbnail

📌 문제

다음은 늑대 나라에서 사용하는 올바른 단어에 대한 설명이다.

임의의 양의 정수 n에 대해서, 'w'가 n번 나오고, 그 다음에 'o'가 n번, 그 다음에 'l'이 n번, 그 다음에 'f'가 n번 나온 단어는 올바른 단어이다.
올바른 단어 두 개를 이은 단어도 올바른 단어이다.
1번과 2번 조건으로 만들 수 있는 단어만 올바른 단어이다.
다음은 올바른 단어의 예시이다.

1번 규칙으로 만든 "wolf", "wwoollff", "wwwooolllfff"는 모두 올바른 단어이다.
2번 규칙으로 만든 "wolfwwoollff"은 올바른 단어이다.
2번 규칙을 두 번 써서 만든 "wolfwwoollffwolf"은 올바른 단어이다.
"wfol"은 올바른 단어가 아니다. (순서가 올바르지 않음)
"wwolfolf"는 올바른 단어가 아니다. (문자열의 중간에 다른 문자열을 집어 넣음)
"wwwoolllfff"는 올바른 단어가 아니다. (o가 2번 들어갔다)

입력

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

출력

입력으로 주어진 단어가 올바른 단어인 경우에는 1을, 아니면 0을 출력한다.

예제 입력 1

wolf

예제 출력 1

1

예제 입력 2

wwolfolf

예제 출력 2

0

📌 풀이

💬 Code

import sys
input = sys.stdin.readline


def check(seq, dic):
    if ''.join(seq) == 'wolf' and dic['w'] == dic['o'] == dic['l'] == dic['f']:
        seq = []
        dic = dict(w=0, o=0, l=0, f=0)
    else:
        print(0)
        sys.exit(0)
    return seq, dic


word = list(input().rstrip())
if len(word) < 4:
    print(0)
    sys.exit(0)

# wolf 순서 체크를 위한 seq
former = word[0]
seq = [former]

# wolf 개수 체크를 위한 dic
dic = dict(w=0, o=0, l=0, f=0)
dic[former] = 1

for i in range(1, len(word)):
    dic[word[i]] += 1
    
    if word[i] != former:
        if former == 'f':
            seq, dic = check(seq, dic)
        seq.append(word[i])
        former = word[i]

    if i == len(word) - 1:
        seq, dic = check(seq, dic)

print(1)

💡 Solution

단어가 wolf 순서대로 이루어져 있는지 → seq 리스트로 체크
단어의 각 문자가 같은 횟수(n번)로 등장하는지 → dic 리스트로 체크

이 두 가지를 체크해서 둘 다 만족하면 1을 출력하면 되는 문제다. 이제 코드를 하나하나 뜯어보자.

word = list(input().rstrip())
if len(word) < 4:
    print(0)
    sys.exit(0)

단어가 4글자 이하면 wolf를 완성시킬 수 없기 때문에 0을 출력하고 프로그램을 종료시킨다. 이 예외처리를 안해줬더니 자꾸 99%까지 갔다가 오답판정을 받아서 헤맴 ㅠ

# wolf 순서 체크를 위한 seq
former = word[0]
seq = [former]

# wolf 개수 체크를 위한 dic
dic = dict(w=0, o=0, l=0, f=0)
dic[former] = 1
  • 다른 문자가 나올 때마다 seq에 추가
    그러려면 이전 문자가 뭔지 알아야 하므로 former에 이전 문자를 저장
  • w, o, l, f의 개수를 체크하기 위한 딕셔너리 dic 생성

for i in range(1, len(word)):
    dic[word[i]] += 1
    
    if word[i] != former:
        if former == 'f':
            seq, dic = check(seq, dic)
        seq.append(word[i])
        former = word[i]

    if i == len(word) - 1:
        seq, dic = check(seq, dic)
  • 해당 문자 개수 +1
  • 이전 문자와 다른 문자가 나오면 seq에 추가하고, former 업데이트
  • 이전 문자와 다른 문자가 나왔는데 이전 문자가 f였다면 wolf 한세트가 끝났을 것이므로 check(wolf의 순서와 개수를 체크하는 함수) 실행
  • 마지막 문자라면 check 실행

def check(seq, dic):
    if ''.join(seq) == 'wolf' and dic['w'] == dic['o'] == dic['l'] == dic['f']:
        seq = []
        dic = dict(w=0, o=0, l=0, f=0)
    else:
        print(0)
        sys.exit(0)
    return seq, dic
  • seq를 문자열로 만들어서 wolf와 동일한지, w, o, l, f의 개수가 모두 동일한지 이 두 개를 모두 만족한다면 seq와 dic을 비워주고 다음 문자 탐색하러~
  • 만족하지 못한다면 0을 출력하고 프로그램 종료!
profile
기록하는 개발자 👀

0개의 댓글