- Collentions에 binarySearch()메서드를 제공한다.
- API를 확인해보면
-> comparable 인터페이스를 구현해야한다.
-> comparaTo 메서드를 implement해야한다.
- indexOf()는 정확하지만 오래 걸린다.
Ex) Binary Search
<hide/>
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);
// 같은 value가 들어가면 같은 해시값이 나온다.
// 키로 사용되는 것은 해시코드를 호출해서 나온 해시값을 이용해서 인덱스로 이용한다.
}
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) ); // binarySearch: 인덱스를 리턴
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(배열명): 배열을 오름차순으로 정렬한다.
<hide/>
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
Arrays.sort(phone_book); // sort로 정렬하면 119와 1195524421이 옆자리에 정렬된다.
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의 개수
<hide/>
class Solution{
boolean solution(String s){
int p = 0;
String s2 = s.toLowerCase(); //s의 모든 글자를 소문자로 바꾼다
// s2에 y, p 있는지 한 글자씩 확인
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로 시작하지 않는 문자들은 모두 제거한다.
<hide/>
class Solution {
public int solution(String skill, String[] skill_trees) {
int answer = 0;
for(String s : skill_trees) {
String s2 = s.replaceAll("[^"+skill+"]" , "");
//skill_trees에 있는 모든 스트링에 대해
// skill에 없는 문자들을 모두 공백으로 바꾼다
if( skill.startsWith(s2) ) answer++;
// skill에 없는 문자를 제거한 새로운 문자열 s2에대해
// skill이 s2로 시작하는지 확인하여 카운트한다.
}
return answer;
}
}
'자료구조와 알고리듬 With Java > [프로그래머스] Algorithm' 카테고리의 다른 글
Part 08 Graph (그래프) (0) | 2022.03.24 |
---|---|
Part 07 정렬 (Sort) (0) | 2022.03.24 |
Part 05 Stack과 Queue (0) | 2022.03.23 |
Part 04 집합 (Set) (0) | 2022.03.22 |
Part 03 Map (0) | 2022.03.22 |