문제 이해
두 배열을 크기 순서대로 합치는 문제이다.
두 배열에 대한 포인터를 두 개 선언해서 풀면 간단하게 풀 수 있다.
한 배열에 대한 포인터가 배열의 범위를 벗어나면 다른 배열에는 이전에 넣었던 값보다 더 큰 값만 남기 때문에 나머지 배열의 요소를 그대로 출력하면 된다.
문제 해결
1. 두 배열에 대한 포인터 선언
int p1=0;
int p2=0;
2. 포인터를 이용하여 배열의 대소를 비교하여 작은 값을 출력
while(p1<N &&p2<M){
if(arr[p1]<=arr2[p2]){
sb.append(arr[p1++]+" ");
}
else{
sb.append(arr2[p2++]+" ");
}
}
3. 아직 출력하지 못한 부분이 있는 배열을 출력
if(p1==arr.length){
for(int j=p2; j<M; j++){
sb.append(arr2[j]+" ");
}
}
else if(p2==arr2.length){
for(int j=p1; j<N; j++){
sb.append(arr[j]+" ");
}
}
<전체 코드>
import java.io.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.StringTokenizer;
public class Problem11728 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
int[] arr2 = new int[M];
st = new StringTokenizer(br.readLine());
for(int i =0; i<N; i++){
arr[i]=Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for(int i=0; i<M; i++){
arr2[i]=Integer.parseInt(st.nextToken());
}
int p1=0;
int p2=0;
while(p1<N &&p2<M){
if(arr[p1]<=arr2[p2]){
sb.append(arr[p1++]+" ");
}
else{
sb.append(arr2[p2++]+" ");
}
}
if(p1==arr.length){
for(int j=p2; j<M; j++){
sb.append(arr2[j]+" ");
}
}
else if(p2==arr2.length){
for(int j=p1; j<N; j++){
sb.append(arr[j]+" ");
}
}
System.out.println(sb);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준-11729번/하노이 탑 이동 순서(java) (0) | 2024.12.29 |
---|---|
백준-1780번/종이의 개수(java) (0) | 2024.12.29 |
백준-10816번/숫자 카드 2 (java) (0) | 2024.10.06 |
백준-1541번/잃어버린 괄호 (java) (2) | 2024.10.05 |
백준-10610번/30 (java) (1) | 2024.10.04 |