알고리즘

[백준, 자바, 11728번] 배열 합치기

hminor 2024. 10. 12. 16:57
반응형

풀이

  • 처음에는 그냥 맥시멈 인자값까지 배열을 만들고
  • 배열을 확인하면서 visit으로 체크해서 해결해보려고 했는데
  • 범위가 +-1000000000이라서... 오우 하면서 다시 생각해보다가
  • 무심코 내려버린 스크롤에 의해... 봐버렸다..
  • 투 포인트...
  • 그래서 다시 깨달을 수 있었다는 것으로 만족하자고 생각함.
  • 그리고 주어지는 배열은 정렬이 되어 있는 배열이기에
  • 따로 재귀로 객 배열을 정렬할 필요 없었기에 그냥 넘어가고
  • 인덱스 값 비교에 따른 값을 result에 하나씩 추가
  • 여기서 처음에 고려하지 못한 점은
  • 인덱스를 조기에 다채워서 조건식에 맞지 않을 경우를 예상하지 못함
  • 이를 위해 조건식을 추가하여 해결.
  • 물론 더 효율적인 방법이 있겠지만, 코드의 중복을 우선은 줄이고자 아래와 같이 해결

 

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.stream.Collectors;
public class _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[] a_li = new int[N];
        int[] b_li = new int[M];
        int[] result = new int[N+M];

        st = new StringTokenizer(br.readLine());
        for (int i=0; i<N; i++) a_li[i] = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        for (int i=0; i<M; i++) b_li[i] = Integer.parseInt(st.nextToken());

        int a_idx = 0;
        int b_idx = 0;

        for (int i=0; i<N+M; i++) {
            if (N>a_idx&&M>b_idx) {
                if (a_li[a_idx]>=b_li[b_idx]) {
                    result[i] = b_li[b_idx];
                    b_idx++;
                } else {
                    result[i] = a_li[a_idx];
                    a_idx++;
                }
            }
        }

        int s_idx = a_idx+b_idx;
        if (N==a_idx) {
            a_li = b_li;
            a_idx = b_idx;
        }

        for (int i=s_idx; i<N+M; i++) {
            result[i] = a_li[a_idx];
            a_idx++;
        }

        System.out.println(Arrays.stream(result).mapToObj(String::valueOf).collect(Collectors.joining(" ")));
    }
}