다음은 늑대 나라에서 사용하는 올바른 단어에 대한 설명이다.
임의의 양의 정수 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을 출력한다.
wolf
1
wwolfolf
0
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)
단어가 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
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)
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