본문 바로가기

Algorithm/문제풀이

[LeetCode] 4번: Median of Two Sorted Arrays

문제링크https://leetcode.com/problems/median-of-two-sorted-arrays/

 

문제풀이

두 배열을 합쳤을 때 중간 값을 출력하는 문제이다.

홀수 개 일 때는 중간 값 출력, 짝수 개 일 때는 중간 두 값의 평균을 출력한다.

 

문제를 보니 병합정렬이 생각나서 그 방식을 떠올리며 문제를 풀었다.

 

1) nums1과 nums2의 길이를 더한 만큼의 크기로 배열을 생성한다.

 

2) 각 배열의 첫번째 값, nums1[0]과 nums2[0]를 비교한다.

   더 작은 값을 nums 배열에 넣는다.

 

3) 이전 작업에서 nums1[0] 값을 넣었으므로, 다음 값을 비교한다.

   nums1[1]과 nums2[0]을 비교해 더 작은 값을 nums 배열에 넣는다.

 

(이하반복)

 

4) 2~3 작업을 반복하게 되면 nums1 끝까지 비교가 끝나 위와 같은 결과가 나온다.

 

5) 비교를 하지 않은 나머지 값들을 배열에 순서대로 채운다.

 

6) 배열의 중간 값을 반환한다.

 

 

---

 

주어진 두 배열은 이미 정렬된 배열이고,

어차피 중간 인덱스에 해당하는 값 하나 또는 두 개만 구하면 되니까.. 배열을 따로 생성해서 정렬할 필요는 없을 것 같다.

아마 솔루션이 그렇게 풀어져 있는 듯..!. 다음에 풀어봐야지..

 

 

소스코드

https://github.com/jjadekwon/algorithm-java/blob/master/src/leetcode/MedianOfTwoSortedArrays.java

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int length1 = nums1.length;
        int length2 = nums2.length;
        
        int i, j, k;
        i = j = k = 0;
		int[] nums = new int[length1 + length2];
        while (i < length1 && j < length2) {
        	nums[k++] = nums1[i] < nums2[j] ? nums1[i++] : nums2[j++];
        }
        
        if (i == length1) {
        	for (; k < nums.length; k++) {
            	nums[k] = nums2[j++];
            }
        }
        else {
        	for (; k < nums.length; k++) {
            	nums[k] = nums1[i++];
            }
        }
        
        if (nums.length % 2 == 0) return (double)(nums[nums.length / 2 - 1] + nums[nums.length / 2]) / 2;
        else return nums[nums.length / 2];              
    }
}

 

'Algorithm > 문제풀이' 카테고리의 다른 글

[백준] 2562번: 최댓값  (0) 2019.07.05
[백준] 2164번: 카드2  (0) 2019.07.05
[LeetCode] 3번: Longest Substring Without Repeating Characters  (0) 2019.06.29
[LeetCode] 2번: Add Two Numbers  (0) 2019.06.28
[LeetCode] 1번: Two Sum  (0) 2019.06.28