Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 오픽
- 안드로이드주석
- 영어회화
- 영어말하기
- XML
- 다이나믹프로그래밍
- 안드로이드
- 피보나치수열
- fibo
- 오픽점수잘받는방법
- topdown
- 이진탐색 #나무 자르기
- ㅂ
- dp
- 디피
- 바텀업
- 메모이제이션
- 오픽노잼공부방법
- XML주석
- 주석
- 탑다운
- stack 스택
- opic
- 오픽가격
- 오픽노잼
- 이진탐색
- dynamicProgramming
- 오픽공부법
- English
Archives
RUBY
[카카오] 가사 검색 본문
출처:: programmers.co.kr/learn/courses/30/lessons/60060
분류:: 이분탐색
1. 문제 이해 및 해결과정
- bisect이용 1. words의 길이를 세서 길이 별로 배열을 따로 저장한다. 2. 접두사를 해결하기 위해 words를 뒤집은 배열을 저장한다 3. 정렬 4. count_by_range()함수를 이용해서 접미사에 ? 있으면 a부터 z까지의 범위 내의 개수를 찾는다 ex) fro?? 라면 froaa보다 크거나 같고 frozz보다 작거나 같은 단어의 개수를 센다 5. 접두사에 ? 인경우를 처리하기 위해 reversed를 이용한다 6. 개수 저장한다 |
2. 풀이방법
1. python 이분탐색
from bisect import bisect_left,bisect_right #정렬된배열에서 특정 원소를 찾을 때
#값이 [left_value,right_value] 인 데이터의 개수를 반환하는 함수
def count_by_range(a,left_value,right_value):
right_index = bisect_right(a,right_value)
left_index = bisect_left(a,left_value)
return right_index-left_index
arr = [[] for _ in range(10001)]
reversed_arr = [[] for _ in range(10001)]
def solution(words, queries):
answer = []
for word in words:
arr[len(word)].append(word)
reversed_arr[len(word)].append(word[::-1]) #뒤집어서 삽입
for i in range(10001): #정렬
arr[i].sort()
reversed_arr[i].sort()
for q in queries:
if q[0] != '?': #접두사에 와일드 카드
res=count_by_range(arr[len(q)],q.replace('?','a'),q.replace('?','z'))
else:
res=count_by_range(reversed_arr[len(q)],q[::-1].replace('?','a'),q[::-1].replace('?','z'))
answer.append(res)
return answer
3. 오답원인
4. 알게된 점
'PS > This' 카테고리의 다른 글
[이론] 구현 (0) | 2020.09.10 |
---|---|
[이론] 투포인터(Two pointers) (0) | 2020.09.09 |
문자열 재정렬 (0) | 2020.09.08 |
[카카오] 괄호 변환 (0) | 2020.09.07 |
[백준] 병사 배치하기 (0) | 2020.09.01 |
Comments