728x90
설명
오름차순으로 정렬이 된 두 배열이 주어지면 두 배열을 오름차순으로 합쳐 출력하는 프로그램을 작성하세요.
입력
첫 번째 줄에 첫 번째 배열의 크기 N(1<=N<=100)이 주어집니다.
두 번째 줄에 N개의 배열 원소가 오름차순으로 주어집니다.
세 번째 줄에 두 번째 배열의 크기 M(1<=M<=100)이 주어집니다.
네 번째 줄에 M개의 배열 원소가 오름차순으로 주어집니다.
각 리스트의 원소는 int형 변수의 크기를 넘지 않습니다.
출력
오름차순으로 정렬된 배열을 출력합니다.
예시 입력1
3
1 3 5
5
2 3 6 7 9
예시 출력1
1 2 3 3 5 6 7 9
풀이
퀵 정렬을 하게 된다면 시간 복잡도는 O(N * log N) 이다.
60000 개의 데이터를 정렬한다고 하면, 60000 * 16 = 960000번 정렬해야 한다.
시간복잡도를 최소화 하기 위해서, O(N) 이 되도록 짜야 한다.
P1 이라는 포인터는 a 배열의 0번 인덱스를 가리킨다.
P2 이라는 포인터는 b 배열의 0번 인덱스를 가리킨다.
a[p1] < b[p2] 이면 answer(배열)에 a[p1]을 추가하고, p1 포인터를 1 증가시킨다.
그렇지 않다면 answer(배열)에 b[p2]를 추가하고, p2 포인터를 1 증가시킨다.
a[p1++], b[p2++]와 같이 후위 연산자를 사용한다.
하나의 배열의 포인터가 끝까지 왔다면 while문은 멈춘다.
남은 배열은 끝까지 answer 에 넣는다.
코드
package inflearn._3_1;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static 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++]); // p1 이 가르키는 값을 add 하고 p1이 1 증가
else answer.add(b[p2++]);
}
// a 배열이 남아있는 경우
while(p1 < n) answer.add(a[p1++]);
// b 배열이 남아있는 경우
while(p2 < m) answer.add(b[p2++]);
return answer;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int [] a = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < n; i++) {
a[i] = Integer.parseInt(st.nextToken());
}
int m = Integer.parseInt(br.readLine());
int [] b = new int[m];
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < m; i++) {
b[i] = Integer.parseInt(st.nextToken());
}
ArrayList<Integer> answer = solution(n, m, a, b);
for(int i : answer) {
sb.append(i).append(" ");
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
728x90
'Coding Test Inflearn' 카테고리의 다른 글
[Sliding Window] 최대 매출 (0) | 2024.04.01 |
---|---|
[Two pointers] 공통 원소 구하기 (0) | 2024.03.31 |
[Greedy Algorithm] 최대 수입 스케쥴(PriorityQueue 응용문제) (0) | 2024.03.27 |
[Greedy Algorithm] 결혼식 (0) | 2024.03.21 |
[Greedy Algorithm] 회의실 배정 (0) | 2024.03.20 |