Closed yeongleej closed 1 month ago
🤔 시간복잡도 고려사항
💡 풀이 아이디어
s1.compareTo(s2)
== 0 : s1와 s2가 같음s1.compareTo(s2)
> 0 (양수) : s2가 s1보다 사전순으로 앞섬s1.compareTo(s2)
< 0 (음수) : s2가 s1보다 사전순으로 뒤에 있음srr[i].compareTo(word) >= 0
인 최소 인덱스 찾기🤔 시간복잡도 고려사항
정렬비용 + 1,000 × 100,000
> 1억 (시간초과)정렬비용 + 1,000 × log(100,000)
< 1억💡 풀이 아이디어
Node 클래스
String str
: 입력된 문자의 정보int idx
: 몇 번째로 입력됐는지에 대한 정보getUppderIdx(String str)
str
로 시작하는 단어가 끝난 직후 idx
를 구하는 함수S1.startWith(S2)
함수 이용S1
이 문자열 S2
로 시작했다면 true
반환S1.compareTo(S2)
S1
가 S2
보다 앞서있음S1
과 S2
가 같음S1
가 S2
보다 뒤에 있음 getLowerIdx(String str)
str
로 시작하는 단어가 시작되는 idx
를 구하는 함수Node[] arr
를 입력 후 정렬T
개수만큼 반복
lowerIdx
와 uppderIdx
찾기
int diff = (uppderIdx - lowerIdx) - 1;
if(diff < a - 1) -1;
else arr[lowerIdx + (a - 1)].idx + 1
upperIdx
는 구할 필요가 없었네요 !! ㅎㅎ
🤔 시간복잡도 고려사항
O(n logn)
으로 줄이기 -> 이분탐색
사용💡 풀이 아이디어
ArrayList
: 사전 순으로 정렬한 단어 저장HashMap
: 각 단어가 입력된 원래 위치(Key, Value값 함께 저장)Collections.sort
사전 순으로 정렬 이분 탐색
으로 확인 -> 존재하지 않을 경우 -1 출력lower
nextPrefix
🤔 시간복잡도 고려사항
O(NlogN)
이내로 풀기💡 풀이 아이디어
처음에 트라이 문제인줄 알고,,, 공부하면서 풀었는데 실패했습니다🥹 이분탐색 문제였네요ㅠㅠ
- 트라이로 풀 경우 메모리 초과
- 최대단어개수
(N)100,000 * (T) 1000 *a
만큼의 공간을 가지고 있어야하는데 너무 큼- 조건으로 알파벳이 소문자만 주어지는지 등도 알 수 없음
문제를 똑바로 읽고! 어떤 알고리즘 유형을 사용해야할지 더더 생각하고 문제 풀어야겠습니다!!!!
🤔 시간복잡도 고려사항
💡 풀이 아이디어
HashMap
을 이용해서 입력된 순서를 저장이분 탐색
으로 해당 접두사를 가지는 가장 작은 인덱스(Lower Bound)를 찾음-1
반환
private static int getLowerBound(String prefix) {
int l = 0, r = words.length - 1;
while (l <= r) {
int m = (l + r) / 2;
if (words[m].compareTo(prefix) < 0)
l = m + 1;
else
r = m - 1;
}
return l - 1;
}
words[idx + lowerBound - 1].startsWith(prefix)
순간 공간복잡도 신경안쓰고 편하게 TreeMap으로 구현하려다가 메모리 초과났네요😿
🤔 시간복잡도 고려사항
O(NlogN)
이내로 풀이하기💡 풀이 아이디어
startWith()
와 compareTo()
에 따라 이분탐색(start,end)시간 제한: 1000ms 초과한거 같은데..? 왜 통과된걸까요? 다른분들 코드보고 리팩토링을 해봐야겠어요ㅜㅜ 코드리뷰 환영해요🤩
수빈님 코드 참고해서 리팩토링 했더니 798ms 로 줄였어요!