13022번: 늑대와 올바른 단어
첫째 줄에 단어가 주어진다. 단어는 w, o, l, f로만 이루어져 있으며, 길이는 50을 넘지 않는다.
www.acmicpc.net
문제
다음은 늑대 나라에서 사용하는 올바른 단어에 대한 설명이다.
- 임의의 양의 정수 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을 출력한다.
코드
word = input()
wolf = set(['w'*i+'o'*i+'l'*i+'f'*i for i in range(1, 13)])
# 첫 글자가 w가 아니거나 단어 길이가 4의 배수가 아니라면 올바르지 않은 단어
if word[0] != 'w' or len(word) % 4 != 0:
print(0)
exit()
start = 0
while True:
end = start + 1
if end >= len(word):
break
# w들 스킵
while word[end] == 'w':
end += 1
if end >= len(word): # w가 단어의 끝에 나온다는 건 올바르지 않은 단어
print(0)
exit()
# 다음 단어 나올 때까지
while word[end] != 'w':
end += 1
if end >= len(word):
break
# 1번 규칙으로 만든 올바른 단어인지 확인
if word[start:end] not in wolf:
print(0)
exit()
start = end
print(1)
단어의 길이는 50을 넘지 않는다고 했으므로 가능한 단어들을 미리 set으로 만들어 놓고 이 set을 이용하여 확인한다.
우선 첫 글자가 'w'가 아니거나 단어의 길이가 4의 배수가 아니라면 절대 올바른 단어가 될 수 없으므로 이 조건을 먼저 검사해준다. 그리고 나서 단어들을 잘라서 가능한 단어들을 저장해둔 wolf 셋에 포함되는지 확인한다. 단어들을 자를 때는 우선 연속된 'w'들을 스킵해준다. 이때 인덱스가 'w'들을 스킵하던 중 단어의 끝에 도달한다면 이는 틀림없이 올바르지 않은 단어이므로 0을 출력하고 프로그램을 종료시킨다. 'w'들을 다 스킵한 뒤에는 다음 w가 나오거나 단어의 끝에 도달할 때까지 end 값을 계속 증가시킨다. 그리고 word[start:end] 문자열이 wolf 배열에 있는 단어인지 확인해본다. 없다면 이는 올바르지 않은 단어이므로 0을 출력하고 프로그램을 종료한다.
'문제풀이 > 문자열' 카테고리의 다른 글
[Python/파이썬] 백준 1283번 단축키 지정 (1) | 2023.12.21 |
---|---|
[Python/파이썬] 백준 3107번 IPv6 (1) | 2023.05.13 |
[Python/파이썬] 백준 20210번 파일 탐색기 (0) | 2023.03.28 |
[Python/파이썬] 백준 20437번 문자열 게임 2 (0) | 2023.03.27 |
[Python/파이썬] 백준 17413번 단어 뒤집기 2 (0) | 2023.03.25 |