반응형

설명

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

입력

첫 번째 줄에 첫 번째 배열의 크기 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

 


접근 방법

우선, 출력값을 보니 중복을 허용하는 것을 알 수 있다. 그렇다면 Collection 프레임워크의 sort 메소드를 사용한다 해도, set은 안되겠다고 생각했다. 그래서 list를 활용하거나, 단순 구현을 통해 해결 할 수 있다고 생각했다.

 

1. 단순 구현 (two pointer)

 

import java.util.*;

class Main{
	
	public ArrayList<Integer> solution(int N, int M, int[] arr1, int[] arr2) {
		
		ArrayList<Integer> answer = new ArrayList<>();
		int p1 = 0;
		int p2 = 0;
		
		while(p1 < arr1.length && p2 < arr2.length) {
			if(arr1[p1] < arr2[p2]) answer.add(arr1[p1++]);
			else answer.add(arr2[p2++]);
		}
		while(p1 < arr1.length) answer.add(arr1[p1++]);
		while(p2 < arr2.length) answer.add(arr2[p2++]); 
		
		return answer;
	}
	
	public static void main(String args[]) {
		
		Scanner sc = new Scanner(System.in);
		Main T = new Main();

		int N = sc.nextInt();
		int[] arr1 = new int[N];
		
		for(int i = 0; i < N; i++) {
			arr1[i] = sc.nextInt();
		}
		
		int M = sc.nextInt();
		int[] arr2 = new int[M];
		
		for(int i = 0; i < M; i++) {
			arr2[i] = sc.nextInt();
		}
		System.out.println(T.solution(N, M, arr1, arr2));
	}		
}

 

 

2. sort를 활용한 방법

import java.util.*;
import java.io.*;
public class Main {
    static int N, M;

    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter((System.out)));

        LinkedList<Integer> list = new LinkedList<>();

        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        String []str = br.readLine().split(" ");

        for (int i = 0; i < N; i++) {
            list.add(Integer.parseInt(str[i]));
        }

        st = new StringTokenizer(br.readLine());
        M = Integer.parseInt(st.nextToken());
        String[] str1 = br.readLine().split(" ");
        for (int i = 0; i < M; i++) {
            list.add(Integer.parseInt(str1[i]));
        }

        Collections.sort(list);

        for (int x : list) {
            System.out.print(x + " ");
        }
    }
}

 

강의에 나온대로 풀이를 풀어도 되고, 두번째 방법은 백준 스타일로 문제를 풀어봤다.

이렇게 유연하게 대처할 수 있어야 실제 코테에서는 잘 해결할 수 있으니까..!!

물론, 대부분의 기업이 프로그래머스에서 시험을 치기 때문에, 직접 입력값과 출력값을 넘기는 부분까지는 하지 않아도 된다. 그래도 손코딩 하다보면 더 잘 이해가 되는 경향이 있으니까, 귀찮아도 반복 또 반복하는 게 좋다.


이 글의 문제는 인프런 강의에서 참고하였습니다.

 

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%EC%BD%94%ED%85%8C%EB%8C%80%EB%B9%84/dashboard

 

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 - 인프런

자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성

www.inflearn.com

 

반응형

+ Recent posts