Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Navigation
- react
- web view
- 상속 관계 매핑
- springboot
- 경우의 수
- 자료구조
- FlatList
- 노마드코더
- React Natvive
- 창의충전소
- multipart upload
- React Native
- bfs dfs
- 완전탐색
- 백준 1992
- 티스토리챌린지
- 이영직
- ReactNative
- service 테스트
- 원복
- BFS
- 구현
- 해외 대외활동
- 폴더구조
- Project Bee
- 휴대폰 기기
- 버튼 활성화
- 오블완
- 비트마스킹
Archives
- Today
- Total
유미의 기록들
[알고리즘 -6] 이분탐색, LIS 본문
728x90
반응형
이분탐색 (Binary Search)
오름차순으로 정렬되어 있는 리스트에서 같은 크기의 두 부분으로 나누고 필요한 부분에서만 탐색하도록 제한하여 원하는 데이터를 찾는 알고리즘
1. 정렬된 배열의 중간요소와 어떠한 대상 값을 비교한다
2. 그 요소가 아닌 경우 절반을 제거하고 나머지 절반에서 검색을 반복한다
2-1. 그 요소가 중간요소보다 작을 경우, 왼쪽으로 다시 탐색
2-2. 그 요소가 중간요소보다 클 경우, 오른쪽으로 다시 탐색
이렇게 정렬된 배열에서 중간값이 어떠한 대상 값보다 큰지, 작은지 비교하고 탐색 범위를 반으로 나누기 때문에 시간복잡도는 logN이다.
v배열에서 찾는 값이 n일때 코드이다
while(l <= r){
mid = (l + r) / 2;
if(v[mid] > n) r = mid - 1;
else if(v[mid] == n) return 1;
else l = mid + 1;
}
📌 이분탐색 알고리즘 문제
https://www.acmicpc.net/problem/2792
import java.util.*;
import java.io.*;
public class Main{
static int n,m;
static int nList[],mList[];
static int search(int num){
int l=0; int r=n-1;
int check=0;
while(l<=r){
int mid=(l+r)/2;
if(nList[mid]==num){
check=1;
return check;
}else if(nList[mid]>num){
r=mid-1;
}else{
l=mid+1;
}
}
return check;
}
public static void main(String[]args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int T;
T=Integer.parseInt(br.readLine());
for(int test_case=0;test_case<T;test_case++){
//입력
n=Integer.parseInt(br.readLine());
nList=new int[n];
st=new StringTokenizer(br.readLine());
for(int i=0;i<n;i++){
nList[i]=Integer.parseInt(st.nextToken());
}
m=Integer.parseInt(br.readLine());
mList=new int[m];
st=new StringTokenizer(br.readLine());
for(int i=0;i<m;i++){
mList[i]=Integer.parseInt(st.nextToken());
}
//정렬
Arrays.sort(nList);
//이분탐색
for(int i=0;i<m;i++){
bw.write(Integer.toString(search(mList[i])));
bw.write('\n');
}
bw.flush();
}
}
}
LIS (Longestr Increase Sequence), 최장 증가 부분 수열
어떤 수열에서 일부 원소를 골라서 만들 수 있는 수열 중에서, 길이가 최대이면서 오름차순을 유지하는 수열
📌 LIS 문제
https://www.acmicpc.net/problem/11053
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[]args) throws IOException{
Scanner sc=new Scanner(System.in);
int ret=0;
int n;
int a[],cnt[];
n=sc.nextInt();
a=new int[n];
cnt=new int[n];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
for(int i=0;i<n;i++){
int maxValue=0;
for(int j=0;j<i;j++){
if(a[j]<a[i] && maxValue<cnt[j]){
maxValue=cnt[j];
}
}
cnt[i]=maxValue+1;
ret=Math.max(ret,cnt[i]);
}
System.out.println(ret);
}
}
728x90
반응형
'코딩테스트 기록 > 알고리즘 개념' 카테고리의 다른 글
[알고리즘 -5] 그리디, 라인스위핑, 투포인터 (1) | 2024.04.24 |
---|---|
[알고리즘 -4] 비트마스킹 (0) | 2024.04.15 |
[알고리즘 -3] 완전탐색, 백트래킹 (0) | 2024.03.13 |
[알고리즘 -2] 깊이 우선 탐색(DFS) vs 너비 우선 탐색(BFS) (0) | 2024.02.20 |
[알고리즘 -1] 시간복잡도, 빅오표기법, 공간복잡도 (0) | 2024.01.17 |
Comments