본문 바로가기

개발중/Algorithm

Merge 알고리즘

728x90
반응형

오늘은 MergeInterval 알고리즘을 풀어 보자

 

Interval 함수를 만들어서

start 값과

end 값을 선언한다

 

 

 

 

 

 

 

 

 

 

Interval 의 start값과 end 값 사이에 겹치는 구간이 있다면

하나로 병합해주는 알고리즘이다.

 

예를 들어서 [ 1, 3 ] , [ 2, 6 ]

두번째 Interval 의 start 값이 첫번째 Interval 과 겹친다.

 

그럴경우 이렇게 병합 하는 것을 반복 해야 한다 => [ 1, 6 ]

 

Interval 의 인스턴스들을 여러개 생성하고

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

인스턴스들을 담기 위한 그릇을 만든다.

 

 

 

 

 

 

 

 

 

 

 

 

 

배열에 모두 add 시켜주자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

merge 함수로 intervals 을 보낸다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

isEmpty() 객체가 비어있다면

그대로 돌려보내라

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

답을 저장할 그릇

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

람다식을 이용해서 오름차순으로 정렬한다.

 

물론 순서를 바꾸면 내림차순

 

람다식은 예전에 배웠는데 함수를 그냥 진짜 필요한 부분만 골라서 쓰는

 

(a, b) -> a.start-b.start

 

오름차순 정렬 완료.

 

Collections 클래스는 Collection 인터페이스를 구현한 클래스에 대한 객체 생성, 정렬, 병합, 검색 등의 기능을 안정적으로 수행하도록 도와주는 역활을 한다

 

 

 

 

 

 

 

 

 

 

List, Set, Queue, Map 

 

 

 

 

 

 

 

 

 

 

 

 

intervals 이 정렬이 끝났잖아?

맨 처음에 있는 Interval 을 가지고 와서 before 에 저장해

 

여기서 before 은 비교 대상이 되는거야

 

첫번째 값

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

위에서는 i가 0부터 시작했지만

곰곰히 생각해보니 1부터 시작해도 될꺼 같아서 1로 바꾸었더니 잘된다

 

 

 

 

 

 

두번째 값 (배열 1번째) 을 가지고 와서

carrent 에 대입한다.

 

 

 

 

 

 

 

첫번째 end 값이랑 두번째 start 값이랑 

비교를 해서

 

첫번째 end 값이 더 크다면

둘이 중복되는 구간이 존재

그러면 병합을 해줘야 해

 

 

 

 

Math.max 함수를 사용해서

첫번째 end 두번째 end 중에서 큰 값을 

before 의 end 값으로 지정

 

 

 

 

 

 

다음 for 문을 실행 할 때 세번째에 있는 current가 if 문에 참이라면 연속 세번이 중복되는 구간이 있다는 것,

 

 

 

 

 

 

없다는 가정하에 bedore을 result 에 대입 해준다.

 

before 에는 current 로 reset

 

다음 비교 대상을 선택하기 위해서

 

 

 

 

 before 이 null 이 아니라면

즉, 마지막 값이 남아있을꺼 아니야!

 

 

마지막 값을 result에 다가 대입을 시켜줘야지!

 

 

 

결과는 이렇게 나오는데

정렬전에는 add 한 값 그대로 입력이 되어있고

 

 

정렬후에는 Collections 함수에 정의한 람다식으로 인해서

깔끔하게 오름차순으로 정의된다.

 

 

중복되는 start 값과 end 값이 잘 병합이 된것이 보인다.

이번 알고리즘은 확실히 이해 되었다. 신난다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

package soobin.algorithm;

import java.util.*;

class Interval {

	int start;
	int end;

	Interval() {
		start = 0;
		end = 0;
	}

	Interval(int s, int e) {
		start = s;
		end = e;
	}
}

public class MergeInterval {

	public static void main(String[] args) {

		Interval in2 = new Interval(2, 6);
		Interval in1 = new Interval(1, 3);
		Interval in3 = new Interval(8, 10);
		Interval in4 = new Interval(15, 18);

		List<Interval> intervals = new ArrayList<>();
		MergeInterval a = new MergeInterval();

		intervals.add(in2);
		intervals.add(in1);
		intervals.add(in3);
		intervals.add(in4);

		List<Interval> list = a.merge(intervals);

	}

	public List<Interval> merge(List<Interval> intervals) {

		if (intervals.isEmpty()) {
			return intervals;
		}

		List<Interval> result = new ArrayList<Interval>();
		System.out.print("==============정렬전\n");
		print(intervals);
		// 람다 표현식으로 오름차순
		Collections.sort(intervals, (a, b) -> a.start - b.start);
		System.out.print("==============정렬후\n");
		print(intervals);

		Interval before = intervals.get(0); // [1, 3]

		for (int i = 0; i < intervals.size(); i++) {
			Interval current = intervals.get(i);

			if (before.end >= current.start) {
				before.end = Math.max(before.end, current.end);
			} else {
				result.add(before);
				before = current;
			}
		}

		if (!result.contains(before)) {
			result.add(before);
		}

		System.out.print("==============\n");
		print(result);
		return result;
	}

	public void print(List<Interval> list) {

		for (int i = 0; i < list.size(); i++) {
			Interval in = list.get(i);
			System.out.println(in.start + "," + in.end);
		}
	}
}

 

728x90
반응형

'개발중 > Algorithm' 카테고리의 다른 글

MeetingRoom2 응용 (정)  (0) 2020.08.26
MeetingRoom2  (0) 2020.08.25
Daily Temperature  (0) 2020.08.23
MoveZero  (0) 2020.08.23
MoveZeros  (0) 2020.08.23