알고리즘 & 자료구조/두포인터

[백준] 11728번 -배열 합치기(JAVA)

윤도ri 2022. 6. 9. 19:03

| 접근 방법 

말 그대로 두개의 배열을 입력받아 정렬하여 결과를 출력하면 된다. 이 때 정렬하는 방법은 두가지가 있다. 첫번째는 Arrays.sort 메소드를 사용하고 두번째는 두포인터를 사용하는 것이다. 두가지 다 다뤄보겠다.  

 

| 입출력

BufferedReader 를 사용하여 입력값을 받고 System.out.print 를 사용하여 출력했다.

 

| 1.Arrays.sort 사용하기

 

import java.util.*;
import java.io.*;


public class CombineArray_11728 {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int n = Integer.parseInt(st.nextToken());  //첫번째 배열 길이
		int m = Integer.parseInt(st.nextToken());  //두번째 배열 길이 		
		int [] arr = new int[n+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++) {
			arr[i+n] = Integer.parseInt(st.nextToken()); 
		}
		Arrays.sort(arr); //정렬 
		
		StringBuilder sb = new StringBuilder();
		
		for(int r : arr) {
			sb.append(r+" "); 
					
		}
		System.out.println(sb);

	}

}

| 2.두 포인터 사용하기

- 두개의 배열에 있는 값들을 비교하면서 작은 값들을 먼저 가져오고 포인터를 이동하는 식으로 구현하면 된다. 

포인터는 0부터 시작하여 두개의 배열을 비교한다.&nbsp;이 경우 1이 작으므로 1 을 넣고 포인터를 옮겨준다.
2 < 4 이므로 2를 넣고 a 의 포인터를 옮겨준다
이번에도 3 < 4 이므로 3을 넣고 a의 포인터를 옮겨준다
이때 5 > 4 이므로 4를 넣고 b의 포인터를 늘려준다.
5 < 7 이므로 5를 넣고 a의 포인터를 옮겨준다.
9 > 7 이므로 7을 넣고 b의 포인터를 옮겨주려고 봤더니..?! 더이상 갈곳이 없다..!!

import java.util.*;
import java.io.*;


public class CombineArray_11728 {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
			
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		
		int [] a = new int[n];
		int [] b = new int[m];
		
		st = new StringTokenizer(br.readLine());
		
		for (int i = 0; i < n; i++) {
			a[i] = Integer.parseInt(st.nextToken());
		}
		
		st = new StringTokenizer(br.readLine());
		
		for (int i = 0; i < m; i++) {
			b[i] = Integer.parseInt(st.nextToken());
		}
		
		int p1 = 0, p2=0;
		
		while(p1<n && p2<m) {  //두개의 배열 길이만큼만 탐색해야 하므로 
			if(a[p1]<= b[p2]) {
				sb.append(a[p1++]+" ");
			}
			else {
				sb.append(b[p2++]+" ");
			}
		}
		 //두개의 배열 길이가 같지 않은 경우 값을 다 담지 못하는 경우가 발생한다. 
        //그래서 한 배열의 탐색이 완료한 후에는 다른 배열의 남아있는 값도 넣어주어야 한다. 
		if(p1==n) {
			for (int i = p2; i < m; i++) {
				sb.append(b[i]+" ");
			}
		}
		if(p2==m) {
			for (int i = p1; i < n; i++) {
				sb.append(a[i]+" ");
			}
		}
		System.out.println(sb);

	}

}

| 성능 비교

 

첫번째가 두포인터를 사용했을때고 두번째 제출이 Arrays.sort 를 사용했을 때이다. 성능 차이가 크게 다르지 않다.