Two pointers, Sliding window - 0301. 두 배열 합치기
private static String solution(int n, int m, String[] arr1, String[] arr2) {
String answer = "";
int a = 0, b = 0;
for(int i=0; i<n+m; i++) {
if((b >= m) || (a < n && Integer.parseInt(arr1[a]) < Integer.parseInt(arr2[b]))) {
answer += arr1[a++] + " ";
} else {
answer += arr2[b++] + " ";
}
}
return answer;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
String[] arr1 = sc.nextLine().split(" ");
int m = Integer.parseInt(sc.nextLine());
String[] arr2 = sc.nextLine().split(" ");
System.out.println(solution(n, m, arr1, arr2));
}
public ArrayList<Integer> solution(int n, int m, int[] a, int[] b){
ArrayList<Integer> answer = new ArrayList<>();
int p1=0, p2=0;
while(p1<n && p2<m){
if(a[p1]<b[p2]) answer.add(a[p1++]);
else answer.add(b[p2++]);
}
while(p1<n) answer.add(a[p1++]);
while(p2<m) answer.add(b[p2++]);
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n=kb.nextInt();
int[] a=new int[n];
for(int i=0; i<n; i++){
a[i]=kb.nextInt();
}
int m=kb.nextInt();
int[] b=new int[m];
for(int i=0; i<m; i++){
b[i]=kb.nextInt();
}
for(int x : T.solution(n, m, a, b)) System.out.print(x+" ");
}
해당 문제는 두 배열을 하나의 배열로 합치고, 오름차순으로 정렬하는 문제이다. 이 때 조건은
두 배열이 오름차순으로 정렬되어 있다는 것이다. 접근 방식으로 크게 2가지 방법이 떠오른다.
배열을 합친 후 정렬하는 방식은 가장 쉬운 버블 정렬
을 수행할 시 의 시간 복잡도를
갖고, 퀵 정렬
의 경우 log 의 시간 복잡도를 갖는다.
Two pointers는 각 두 배열의 현재 바라보는 index
를 저장하는 두 변수를 의미한다. 배열을
매번 처음부터 순회하는 것이 아닌, pointer에 저장된 위치에서 시작하여 의 시간 복잡도로
문제를 해결할 수 있다.