728x90
문제
https://www.acmicpc.net/problem/11728
접근 방법
- 간단하게 Arrays.sort로 구하거나, PriorityQueue를 이욯하거나 해서 쉽게 구할 수 있었을 것이다.
- 하지만 투포인터 방법으로 구해보았다.
- 첫번째 배열에서 첫번째 항을 s 두번째 배열에서 첫번째 항을 e 로 두고 작은 부분을 Stringbuilder에 넣어주었다.
- 두 배열중 먼저 끝 지점에 다다를시 배열 하나는 탐색이 다 완료가 되지 않았다는 말로 해당 포인터 부터 나머지 값을 넣어준다.
- 근데 이 투포인터가 가능한 이유는 첫번째 배열과 두번째 배열이 모두 정렬이 되있기 때문에 가능한것이다. 만약 정렬되어 있지 않으면 불가능하다. (ex 첫번째 배열 1,4,2 두번째 배열 3)
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static StringBuilder sb;
private static BufferedReader br;
private static StringTokenizer st;
private static int N,M;
private static int[] arrA,arrB;
//입력
public static void input() throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arrA = new int[N];
arrB = new int[M];
st = new StringTokenizer(br.readLine());
for(int i = 0 ; i < N ; i++){
arrA[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for(int i = 0 ; i < M ; i++){
arrB[i] = Integer.parseInt(st.nextToken());
}
}
//실행
public static void process() {
int s = 0;
int e = 0;
while (s<N && e<M){
if(arrA[s] <= arrB[e]){
sb.append(arrA[s]+" ");
s++;
}else{
sb.append(arrB[e]+" ");
e++;
}
}
if(s==N){
for(int i = e ; i < M; i++){
sb.append(arrB[i]+" ");
}
}else{
for(int i = s ; i < N ; i++){
sb.append(arrA[i]+" ");
}
}
//else 부분 이해를 돕기 위해 else말고 밑에 if절을 써도 된다.
// if(e==M){
// for(int i = s ; i < N ; i++){
// sb.append(arrA[i]+" ");
// }
// }
System.out.println(sb);
}
public static void main(String[] args) throws Exception {
input();
process();
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[Java] 백준 3273번 : 두 수의 합 (0) | 2024.05.25 |
---|---|
[Java] 백준 2003번 : 수들의 합 2 (0) | 2024.05.23 |
[Java] 백준 6219번 : 소수의 자격 (0) | 2024.05.21 |
[Java] 백준 15996번 : 팩토리얼 나누기 (0) | 2024.05.21 |
[Java] 백준 9417번 : 최대GCD (0) | 2024.05.21 |