이 문제는 쿼리 예시 보는 순간 내 안의 작은 아이가 bisect라고 외쳤음.
기본 골격은 단어 배열을 받고, 쿼리에 있는 단어와 조건이 맞는지 검사. 검사하면서 일치하면 카운트하면 된다.
여기서 핵심은 뭐다? '조건을 어떻게 설정할 것인가'가 되겠다. 어떻게 설정할거냐고? 저도 모르죠. 근데 모른다고 안 할것도 아니고 일단 함 해보입시다.
파이썬 문법에 익숙하지 않은데 하나씩 사용해 보면서 해결 방법을 찾아보도록 하겠다. 일단 두들겨 맞으면서 배워.
from bisect import bisect_right, bisect_left
import string
words = list(input().split())
queries = list(input().split())
print(words)
print(queries)
words.sort()
queries.sort()
print(words)
print(queries)
이 코드로 문자 배열도 자동으로 정렬이 되는지 확인해 보자
음음 그래그래. 잘 되네.
from bisect import bisect_right, bisect_left
import string
words = list(input().split())
words.sort()
queries = list(input().split())
result = []
print(queries)
for query in queries:
if query[0] == '?':
print(query, end=' ')
print("?로 시작")
else:
print(query, end=' ')
print("문자로 시작")
자 이거 첫 문자 ?인지 판별하는거 제대로 동작하는지도 확인해.
음 그래. 이게 된다? 그럼 무슨 뜻이야. bisect를 어떻게 활용해서 이 문자열과 '일부 일치'하는지만 찾아내면 끝이다. 어떻게? 나도 모름.. 아직 서로 천천히 알아가는 단계라가지고..
? <- 아스키 코드상 a보다 낮다. 그럼 무슨 뜻이야. bisect_left 하면 여기에 해당하는 문자의 시작 인덱스를 반환하는 것이다.
그럼 이제 끝 인덱스 어떻게 찾으면 될까. 그냥 ? <- 얘를 z보다 높은 숫자로 대체하면 되는거 아님?
아스키코드 컴온. 자 지금부터 ?를 {로 교체하고 bisect_right를 수행해.
from bisect import bisect_right, bisect_left
import string
words = list(input().split())
words.sort()
queries = list(input().split())
result = []
print(words)
print(queries)
for query in queries:
rev_query = query.replace('?', '{')
print(query, bisect_left(words, query), bisect_right(words, rev_query))
제대로 나오는지 확인해.
제대로 나온다. 이제 글자 수 체크하는 것까지 추가해.
from bisect import bisect_right, bisect_left
import string
words = list(input().split())
words.sort()
queries = list(input().split())
result = []
print(words)
print(queries)
for query in queries:
rev_query = query.replace('?', '{')
count = 0
for i in range(bisect_left(words, query), bisect_right(words, rev_query)):
if len(query) == len(words[i]):
count += 1
result.append(count)
print(result)
뒤에서부터 검사하는 경우를 제외하면 정상적으로 출력되는 것을 확인할 수 있다! 이제 이 부분만 추가하면 된다. 근데 이걸 뒤에서부터 검사하는게 되나?
from bisect import bisect_right, bisect_left
def solution(words, queries):
answer = []
words.sort()
rev_words = []
for word in words:
rev_words.append(word[::-1])
rev_words.sort()
for query in queries:
count = 0
if query[0] == '?':
rev_query = query[::-1]
last_query = rev_query.replace('?', '{')
for i in range(bisect_left(rev_words, rev_query), bisect_right(rev_words, last_query)):
if len(rev_query) == len(rev_words[i]):
count += 1
else:
last_query = query.replace('?', '{')
for i in range(bisect_left(words, query), bisect_right(words, last_query)):
if len(query) == len(words[i]):
count += 1
answer.append(count)
return answer
테스트 케이스 제대로 나오니까 일단 제출해