์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿฅš/๋ฌธ์ œํ’€์ด (Python)

[Programmers] ๊ฐ€์‚ฌ ๊ฒ€์ƒ‰ (Lv.4) 2024/4/18

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2024. 4. 18. 19:29
728x90
๋ฌธ์ œ ์ œ๋ชฉ ์ •๋‹ต๋ฅ  ๋‚œ์ด๋„
๊ฐ€์‚ฌ ๊ฒ€์ƒ‰ 47% Lv.4
 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๋ฌธ์ œ์š”์•ฝ
๋…ธ๋ž˜์— ์žˆ๋Š” ๋‹จ์–ด ์ง‘ํ•ฉ words(์ค‘๋ณต X), ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ์ง‘ํ•ฉ queries๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
์กฐ๊ฑด 1) words 2~100,000๊ฐœ, word ๊ธธ์ด 1~10,000, ์†Œ๋ฌธ์ž๋กœ๋งŒ ๊ตฌ์„ฑ
์กฐ๊ฑด 2) queries์˜ ๊ธธ์ด 2~100,000, query์˜ ๊ธธ์ด 1~10,000,? ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จ(์ ‘๋‘์‚ฌ๋‚˜ ์ ‘๋ฏธ์‚ฌ๋กœ๋งŒ ๊ฐ€๋Šฅ)
 

ํ’€์ด

Step1. ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ์กด์žฌ->search์‹œ binary search(log n) ์ƒ๊ฐ (words*queries์‹œ ์‹œ๊ฐ„๋ณต์žก๋„ ์ดˆ๊ณผ)
Step2. ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ์— ๋ถ™์„ ๊ฒฝ์šฐ ์ฐจ์ด

  • ์ ‘๋ฏธ์‚ฌ์— ๋ถ™์„๊ฒฝ์šฐ *aa~*zz๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์„
  • ์ ‘๋‘์‚ฌ๋ฅผ ์ ‘๋ฏธ์‚ฌ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด reverse์‚ฌ์šฉ -> [::-1]

 

์ฝ”๋“œ

from collections import Counter
def search_right(words_list, word):
    start_idx=0
    end_idx=len(words_list)
    while start_idx<end_idx:
        mid=(start_idx+end_idx)//2
        if words_list[mid]==word:
            return idx
        elif words_list[mid]<word:
            start_idx=mid+1
        else:#>start
            end_idx=mid
    return start_idx
                
            
def solution(words, queries):
    # 1 ์ด์ƒ 10,000 ์ดํ•˜
    word_list=[[] for _ in range(10001)]#0~10,000
    word_list_reverse=[[] for _ in range(10001)]#0~10,000
    for word in words:
        word_list[len(word)].append(word)
        word_list_reverse[len(word)].append(word[::-1])
    for word, word_reverse in zip(word_list, word_list_reverse):
        word.sort()
        word_reverse.sort()
    
    answer=[]
    for query in queries:
        query_count=Counter(query.split('?'))
        question_len=query_count['']
        if query[0]=='?':
            query=query[::-1]
            start=query[:-question_len]+'a'*question_len
            end=query[:-question_len]+'z'*question_len
            start_idx=search_right(word_list_reverse[len(query)], start)
            end_idx=search_right(word_list_reverse[len(query)], end)
        else:#*?
            start=query[:-question_len]+'a'*question_len
            end=query[:len(query)-question_len]+'z'*question_len
            start_idx=search_right(word_list[len(query)], start)
            end_idx=search_right(word_list[len(query)], end)
        answer.append(end_idx-start_idx)
    return answer
728x90