diff --git a/src/programmers/gilbut/ch11_datastructure/Q60060.java b/src/programmers/gilbut/ch11_datastructure/Q60060.java new file mode 100644 index 0000000..54f5081 --- /dev/null +++ b/src/programmers/gilbut/ch11_datastructure/Q60060.java @@ -0,0 +1,44 @@ +package programmers.gilbut.ch11_datastructure; + +import java.util.*; + +// 메모리 초과 +class Q60060 { + public int[] solution(String[] words, String[] queries) { + int[] answer = new int[queries.length]; + + HashMap map = new HashMap<>(); + for(String word: words){ + for(int i=0;i> map = new HashMap<>(); + HashMap> reverseMap = new HashMap<>(); + + public int[] solution(String[] words, String[] queries) { + int[] answer = new int[queries.length]; + + // 길이별로 단어 저장 + for(String word: words){ + int len = word.length(); + + map.computeIfAbsent(len, k->new ArrayList<>()) + .add(word); + + String reverseWord = new StringBuilder(word).reverse().toString(); + reverseMap.computeIfAbsent(len, k->new ArrayList<>()) + .add(reverseWord); + } + + // 길이별 정렬 + for(List list: map.values()){ + Collections.sort(list); + } + for(List list: reverseMap.values()){ + Collections.sort(list); + } + + for(int i=0;i list; + + // 접두사일 경우 + if(query.charAt(0) == '?'){ + query = new StringBuilder(query).reverse().toString(); + list = reverseMap.get(len); + } + // 접미사일 경우 + else{ + list = map.get(len); + } + + if(list == null){ + answer[i] = 0; + continue; + } + + String min = query.replace('?','a'); + String max = query.replace('?','z'); + + int start = lowerBound(list,min); + int end = upperBound(list,max); + + answer[i] = end-start; + } + + return answer; + } + + // target 이상이 처음 나오는 위치 + int lowerBound(List list, String target){ + int left = 0; + int right = list.size()-1; + + while(left<=right){ + int mid = (left+right)/2; + + if(list.get(mid).compareTo(target)>=0){ + right = mid-1; + } + else{ + left = mid+1; + } + } + + return left; + } + // target 초과가 처음 나오는 위치 + int upperBound(List list, String target){ + int left = 0; + int right = list.size()-1; + + while(left<=right){ + int mid = (left+right)/2; + + if(list.get(mid).compareTo(target)>0){ + right = mid-1; + } + else{ + left = mid+1; + } + } + + return left; + } +} \ No newline at end of file diff --git a/src/programmers/gilbut/ch12_implementation/Q42884.java b/src/programmers/gilbut/ch12_implementation/Q42884.java new file mode 100644 index 0000000..7b76436 --- /dev/null +++ b/src/programmers/gilbut/ch12_implementation/Q42884.java @@ -0,0 +1,35 @@ +package programmers.gilbut.ch12_implementation; + +import java.util.*; + +class Q42884 { + public int solution(int[][] routes) { + int answer = 0; + + Arrays.sort(routes,(a,b)->a[0]-b[0]); + + int count = 1; + int s1 = routes[0][0]; // -20 + int e1 = routes[0][1]; // -15 + for(int i=1;i N){ + return; + } + if(index == 11){ + // 화살 남은거 다 0점에 몰아줌 + lion[10] += N-count; + + int apeachGrade = 0; + int lionGrade = 0; + for(int j=0;j<10;j++){ + if(Info[j] >= lion[j] && Info[j] != 0){ + apeachGrade += 10-j; + } + else if(Info[j] < lion[j]){ + lionGrade += 10-j; + } + } + + int diff = lionGrade-apeachGrade; + if(diff>0){ + // 점수차 더 큰거 + if(diff>max){ + max = diff; + answer = lion.clone(); + } + + // 점수차 같으면 낮은 점수가 더 많은 거 + else if(diff==max){ + for(int i=10;i>=0;i--){ + if(lion[i] > answer[i]){ + answer = lion.clone(); + break; + } + else if(lion[i] < answer[i]){ + break; + } + } + } + } + + return; + } + + // 라이언 승 + lion[index] = Info[index]+1; + dfs(index+1,count+lion[index],lion); + + // 라이언 포기 + lion[index] = 0; + dfs(index+1,count,lion); + } +} \ No newline at end of file