- Collentions에 binarySearch()메서드를 제공한다.
- API를 확인해보면
-> comparable 인터페이스를 구현해야한다.
-> comparaTo 메서드를 implement해야한다.
- indexOf()는 정확하지만 오래 걸린다.
Ex) Binary Search
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
class MyData implements Comparable<MyData>{
int v;
public MyData(int v) {
this.v = v;
}
public String toString() {
return "" + v;
}
@Override
public boolean equals(Object o) {
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
MyData mydata = (MyData) o;
return v== mydata.v;
}
@Override
public int hashCode() {
return Objects.hash(v);
}
public int compareTo(MyData o) {
return v - o.v;
}
}
public class LinearSearch {
public static void main(String[] args) {
List<MyData>list = new LinkedList<>();
for(int i = 1 ; i <= 100; ++i) {
list.add(new MyData(i));
}
System.out.println(list);
int index = Collections.binarySearch(list, new MyData(63) );
System.out.println(index);
System.out.println(list.get(index));
}
}
Ex) 전화 번호 목록
- sort와 startsWith를 이용한다.
- phone_book[i].startsWith(phone_book[i-1]) : phone_book[i-1]가 phone_book[i]의 접두사인지 확인한다.
- Arrays.sort(배열명): 배열을 오름차순으로 정렬한다.
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
Arrays.sort(phone_book);
for(int i = 1; i < phone_book.length; ++i){
if(phone_book[i].startsWith(phone_book[i-1])) return false;
}
return true;
}
}
Ex) 문자열 내 p와 y의 개수
class Solution{
boolean solution(String s){
int p = 0;
String s2 = s.toLowerCase();
for(char c : s2.toCharArray()) if (c == 'p') p++;
for(char c : s2.toCharArray()) if (c == 'y') p--;
return p == 0;
}
}
- String s2 = s.toLowerCase() : 문자열 s를 모두 소문자로 바꾼다.
- String s2를 한글자씩 char[]배열로 바꿔서 p 또는 y가 있으면 p는 +1, y는 -1을 해준다.
- 나중에 결과 값이 0이면 true
Ex) 스킬 트리 (skill_trees)
- 선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 만들기
- String s2 = s.replaceAll("[^" + skill + "]" , "" );
-> 문자열 s에 대해서 skill로 시작하지 않는 문자들은 모두 제거한다.
class Solution {
public int solution(String skill, String[] skill_trees) {
int answer = 0;
for(String s : skill_trees) {
String s2 = s.replaceAll("[^"+skill+"]" , "");
if( skill.startsWith(s2) ) answer++;
}
return answer;
}
}
ps://programmers.co.kr/learn/courses/13577