[BOJ][⚪2][백준#13022] 늑대와 올바른 단어
작성:    
업데이트:
카테고리: BOJ Silver II
태그: BOJ, BOJ Silver, PS, Python
문제 출처
문제
다음은 늑대 나라에서 사용하는 올바른 단어에 대한 설명이다.
임의의 양의 정수 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
예제 2
입력
wwolfolf
출력
0
My Sol
def main():
def check_main():
pl = check_len_per_part(i)
if i+pl*4 > tl: return False
for j in range(1, 4):
if check_per_part(i+pl*j, pl, list('wolf')[j]): continue
return False
return pl*4
def check_len_per_part(ii):
pl = 0
while ii < tl and txt[ii]=='w':
pl += 1
ii += 1
return pl
def check_per_part(si, pl, c):
for pi in range(pl):
if txt[si+pi] == c: continue
return False
return True
txt = input()
if txt[0] != 'w': return 0
tl = len(txt)
i = 0
while i < tl:
check_ret = check_main()
if not check_ret: return 0
i += check_ret
return 1
print(main())
함수로 구분하여 쉽게 풀 수 있는 문제였다. 문제 풀이의 컨셉은 분할과 정복
이다. 즉, 전체 단어는 wwwooolllfff
와 같이 w,o,l,f가 같은 개수로 반복되는 단어와, 이들의 연결로 되어있기 때문에 w
를 맞이한 순간부터 wolf단어를 판단하고, 만족한다면 넘어가면서 확인하면 되겠다.
main
함수에서 입력을 처음 받는데, 만약 처음 시작이w
로 시작하지 않는다면 무의미하므로 분기처리해주었다.- 각
wolf
단어의 첫 인덱스를i
라고 생각하겠다.txt
의 길이tl
보다 i가 작은 경우에만wolf
단어 판독의 확인을 하는데, 이를check_main
함수에서 해주었다. check_main
함수에서는 w의 단어 길이를 재는check_len_per_part
함수로부터 각 연속단어의 길이pl
을 구하고, 이 각 부분의 4배, 즉wolf
단어를 모두 확인하는 과정에서 인덱스가 전체 길이를 넘어가는지 확인한다. 만약 넘어간다면wolf
단어 생성 자체가 안되므로 버린다.- wolf 단어의 각 문자 각각의 인덱스로부터 단어가 맞는지 확인한다.
- 모두 맞다면 True를 return하고 아니라면 False를 return한다.
- main에서 이를 모두 확인하여
wolf
단어 확인하는check_main
함수에서 모두 True라면 1을, 아니라면 0을 반환한다. - 이를 출력한다.
결과
맞았습니다!!
이번 문제 풀이는 전체 77개의 파이썬3 풀이 중에 연산시간 공동 1등을 기록한 풀이였으며, 개인적으로는 36ms의 연산시간 풀이를 본 적이 없는 터라 신기했던 풀이여서 풀이를 남긴다.
댓글남기기