PS(Java)/인프런 강의 문제

[PS] 인프런 강의 - Two Pointers, Sliding window, Math 1. 두 배열 합치기

UL :) 2022. 10. 21. 16:33

 

문제

오름차순으로 정렬이 된 두 배열이 주어지면 두 배열을 오름차순으로 합쳐 출력하는 프로그램을 작성하세요.

 

▣ 입력설명
첫 번째 줄에 첫 번째 배열의 크기 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

 

풀이

 

두 배열을 입력받은 뒤 Arrays.sort 메서드를 사용해 오름차순 정렬을 하고

기준이 되는 Two pointer p1, p2를 두고 두 배열을 비교해가며 작은 값을 answer 배열에 넣는다.

 

그냥 두 배열을 처음부터 합쳐서 오름차순 정렬을 하면 안되나 싶어서 찾아봤더니 다음과 같은 방법이 있다.

  • 반복문으로 여러 배열을 하나로 병합
  • Commons-lang3 라이브러리로 배열 병합
  • Stream으로 여러 배열을 하나로 합치기

이 블로그를 참고하면 좋을 것 같다. https://codechacha.com/ko/java-join-arrays/

 

코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		int n = in.nextInt();
		int[] arr1 = new int[n];
		for(int i=0; i<n; i++) {
			arr1[i] = in.nextInt();
		}
		
		int m = in.nextInt();
		int[] arr2 = new int[m];
		for(int i=0; i<m; i++) {
			arr2[i] = in.nextInt();
		}
		
		Arrays.sort(arr1);
		Arrays.sort(arr2);
		List<Integer> answer = new ArrayList<>();
		
		//arr1과 arr2 비교
		int p1=0, p2=0;
		while(p1 < n && p2 < m) {
			if(arr1[p1] <= arr2[p2]) answer.add(arr1[p1++]);
			else answer.add(arr2[p2++]);
				
		}
		//길이가 긴 배열의 나머지를 추가
		while(p1 < n) answer.add(arr1[p1++]);
		while(p2 < m) answer.add(arr2[p2++]);
		
		for(int x : answer) {
			System.out.print(x + " ");
		}
	}
}