자바 알고리즘

[leetcode - Java] 88. Merge Sorted Array

Big Iron 2023. 8. 23. 22:07

1. 알고리즘 문제


  1. 배열 nums1과 nums2가 주어지고 각 배열의 유효한 원소 개수는 m, n개 이다.
  2. 두 배열의 유효한 원소를 합쳐 nums1 배열의 총 길이가 m+n이 되도록.(오름차순 정렬)

2. 시도


  • 반복문을 통해 nums1의 원소가 0이라면 nums2의 원소로 교체하면 될 것 같았다.

    class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int j = 0;
    
        for (int i=0; i<m+n; i++) {
            if (nums1[i] == 0) {
                nums1[i] = nums2[j];
                j++;    
            }
        }
        System.out.println("nums1 = " + Arrays.toString(nums1));
        Arrays.sort(nums1);
    }
    }

    위의 코드를 실행하고 3가지 케이스는 성공하였지만 최종 제출했을 때 에러가 발생했다.

    image

3. 실패 분석


  • 예시 문제를 잘못 이해한 듯하다.
  • 예시 문제들과 같이 nums1 배열의 크기는 꼭 m과 동일하지 않았다. 그리고 nums1 배열의 가장 뒤 원소 0의 개수가 nums2 배열의 길이 n과 같았고 nums2의 원소들로 교체되어야 했다.

image

4. 개선


  • if 조건을 수정해 nums1배열의 모든 원소에 대해 0을 검사하고 교체하는 게 아닌, nums1 배열 뒤의 원소가 0인 것들만 확인하여 nums2로 교체하였다.

    class Solution {
      public void merge(int[] nums1, int m, int[] nums2, int n) {
          int j = 0;
    
          for (int i=0; i<nums1.length; i++) {
              System.out.println("nums1 원소 = " + nums1[i]);
              if (nums1.length >= m && n > j) {
                  nums1[m] = nums2[j];
                  j++;
                  m++;
              }
          }
    
          System.out.println("result = " + Arrays.toString(nums1));
          Arrays.sort(nums1);
      }
    }
image