깊은바다거북
개발 공부 기록
깊은바다거북
전체 방문자
오늘
어제
  • 분류 전체보기 (219)
    • JAVA (9)
    • JavaScript (15)
    • 스파르타코딩클럽 (11)
      • [내일배움단] 웹개발 종합반 개발일지 (5)
      • [내일배움캠프] 프로젝트와 트러블 슈팅 (6)
    • SQL | NoSQL (4)
    • CS 등등 (0)
    • TIL | WIL (173)
    • 기타 에러 해결 (3)
    • 내 살 길 궁리 (4)

인기 글

최근 글

최근 댓글

태그

  • Trie
  • tree
  • 자바스크립트 기초 문법
  • 자잘한 에러 해결
  • 코딩테스트 연습문제
  • Backtracking(백트래킹)
  • 최소 힙(Min Heap)
  • leetcode-cli
  • 재귀 함수
  • 트러블 슈팅 Troubleshooting
  • Inorder Traversal(중위 순회)
  • Linked List
  • POST / GET 요청
  • 프로그래머스
  • 최대 힙(Max Heap)
  • Binary Tree(이진 트리)
  • Leetcode
  • 시간 복잡도
  • 자료 구조
  • 혼자 공부하는 자바스크립트
  • BST(이진 탐색 트리)
  • 팀 프로젝트
  • 점화식(Recurrence Relation)
  • BFS(너비우선탐색)
  • TypeScript
  • Til
  • TIT (Today I Troubleshot)
  • DFS(깊이우선탐색)
  • 01. 미니 프로젝트
  • Preorder Traversal(전위 순회)
hELLO · Designed By 정상우.
깊은바다거북

개발 공부 기록

TIL | WIL

10/26 (목) 겹치는 인터벌 합치기 TIL

2023. 10. 26. 14:22

공부한 것

  • LeetCode #56. Merge Interval
    LeetCode - The World's Leading Online Programming Learning Platform
    Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
    https://leetcode.com/problems/merge-intervals/submissions/
    • 어제는 이미 정렬된 인터벌들에 새 인터벌을 하나 끼우는 방식으로, 전체를 한 번만 순회하기 때문에 시간 복잡도는 O(n)O(n)O(n)이면 되었다.
    • 오늘은 정렬되지 않은 전체 인터벌을 겹치는 것끼리 병합하는 문제로, 먼저 정렬 후 전체를 한 번 순회해야 하기 때문에 시간 복잡도가 O(nlogn)O(n log n)O(nlogn)이다.
    • 방법 1: 반환할 인터벌들을 새 배열 result에 넣는 방법
      // Time Complexity: O(n log n)
      // Space Complexity: O(n) 
      function merge1(intervals: number[][]): number[][] {
      	if (intervals.length === 1) return intervals;
      	
      	// 1. start 기준으로 오름차순 정렬하기: O(N logN)
      	intervals.sort((a, b) => a[0] - b[0]);
      	const result = [intervals[0]];
      
      	// 2. 어느 두 연이은 인터벌 중 앞의 end가 뒤의 start보다 크거나 같으면 병합한다: O(N)
      	for (let i = 1; i < intervals.length; i++) {
      		const pre = result[result.length - 1];
      		const post = intervals[i];
      		if (pre[1] >= post[0]) { // 병합하기
      			pre[1] = Math.max(pre[1], post[1]);
      		} else { // 새 인터벌 등장. result에 넣기
      			result.push(post);
      		}
      	}
      
      	return result;
      };
    • 방법 2: result 배열을 사용하지 않는 방법
      // 새 result 배열 없이 해보기:
      // Time Complexity: O(n log n)
      // Space Complexity: O(log n) (in-place sorting을 하므로)
      function merge(intervals: number[][]): number[][] {
      	if (intervals.length === 1) return intervals;	
      	
      	// 1. start 기준으로 오름차순 정렬하기: O(N logN)
      	intervals.sort((a, b) => a[0] - b[0]);
      
      	// 2. 어느 두 연이은 인터벌 중 앞의 end가 뒤의 start보다 크거나 같으면 병합한다: O(N)
      	let pre = intervals[0];
      	for (let i = 1; i < intervals.length; i++) {
      		const post = intervals[i];
      		if (pre[1] >= post[0]) { // 병합하기
      			pre[1] = Math.max(pre[1], post[1]);
      			delete intervals[i]; // delete post;는 안 됨 주의
      		} else { // 새 인터벌 등장. pre를 새 인터벌로 옮긴다.
      			pre = post;			
      		}
      	}
      
      	return intervals.filter(x => true);
      };

    결과: 방법 1과 방법 2에서 유의미한 메모리 차이는 발생하지 않음.


Uploaded by N2T

    'TIL | WIL' 카테고리의 다른 글
    • 10/28 (토) (완료)인터벌이 안 겹치도록 삭제해야 하는 최소 인터벌 개수 TIL
    • 10/27 (금) 인터벌이 안 겹치도록 삭제해야 하는 최소 인터벌 개수 TIL
    • 10/25 (수) (완료)인터벌 끼워넣기 TIL
    • 10/24 (화) 인터벌 끼워넣기 TIL
    깊은바다거북
    깊은바다거북

    티스토리툴바