문제
길이가 m, n이고 오름차순으로 정렬되어 있는 자연수 배열들을 입력받아 전체 요소 중 k번째 요소를 리턴해야 합니다.입력
- 인자 1 : arr1
자연수를 요소로 갖는 배열
arr1.length는 m- 인자 2 : arr2
자연수를 요소로 갖는 배열
arr2.length는 n- 인자 3 : k
number 타입의 0 이상의 정수출력
number 타입을 리턴해야 합니다.
주의사항
두 배열의 길이의 합은 1,000,000 이하입니다.
어떤 배열 arr의 k번째 요소는 arr[k-1]을 의미합니다.
문제를 제대로 읽고 코드를 짜야겠다. 오름차순 정렬되어있다는 걸 제대로 확인했어야 했다. advanced로 시간복잡도를 해결하려면 코드가 더 많이 복잡해진다.
두개의 배열을 꼭 합쳐야 한다고 생각했었다. 그리고 앞서 풀었던 이진탐색을 응용하라고 힌트에 써져있어서 왼쪽 인덱스 가운데 인덱스 그리고 오른쪽 인덱스를 할당하고 시작했다. 물론 이렇게 쓰면서 이건 아닌 거 같은데 느끼긴 했다ㅠ
// 두개의 배열을 합치고, 정렬한다 let newArr = arr1.concat(arr2) let sortArr = newArr.sort((a,b) => a-b) // 왼쪽,오른쪽 인덱스의 반을 나눈다. let left = 0 let right = sortArr.length - 1 while(left <= right) { const mid = parseInt((left + right)/2) for(let k=0; i < sortArr.length; i++) { if(sortArr[k-1] === sortArr[mid]) { return sortArr[k-1] } else { if(sortArr[k-1] < sortArr[mid]) { right = mid -1 } else { left = mid + 1} } } } };
시간복잡도를 해결하지 못하고 순차적으로 조회하는 접근방법이다.
하위 두개 부분은 코드를 보면서 설명하는게 좋을 것 같다.
const getItemFromTwoSortedArrays = function (arr1, arr2, k) { let count = 0, left = 0, right = 0; let target; while (count < k) { if (arr1[left] < arr2[right]) { target = arr1[left]; // 해당값을 찾기위해 계속 진행되고 count도 그에 따라 증가한다. while문을 벗어나는 순간 인덱스의 값이 나온다 left++; } else { target = arr2[right]; // 해당값을 찾기위해 계속 진행되고 count도 그에 따라 증가한다. while문을 벗어나는 순간 인덱스의 값이 나온다 right++; } count++; } return target; };