[Algorithm] 내겐 너무 헷갈리는 정렬

민지·2023년 12월 2일
0

Algorithm

목록 보기
3/8
post-thumbnail

가끔 마주할 때마다 매번 헷갈리는 정렬..
백준 문제 풀며 정리해보았다.

BOJ11650. 좌표 정렬하기

첫번째 기준은 x가 작은순으로, 같다면 y가 작은 순.
오름차순이란 말.

직접 클래스에서 @Override 하지 않고 쓰는 방법들이 있다.
그 중 두가지.

방법1. List.sort() + 람다 표현식

List 인터페이스에 작성된 메서드인 sort().
괄호 안에 Comparator를 구현하면 된다.

예시

class Point {
	int x;
	int y;
}

...

arr.sort((o1, o2) -> {
	if(o1.x != o2.x) return o1.x - o2.x;
	return o1.y - o2.y;
});

sort() 메서드 안에서 compare를 재정의 해주면 된다.
혹은,

arr.sort((o1, o2) -> {
	if(o1.x != o2.x)  return Integer.compare(o1.x, o2.x);
	return Integer.compare(o1.y, o2.y);
});

자료형이 Integer 이므로 그냥 이렇게 비교해줘도 된다.

방법2. List.sort() + 메서드 레퍼런스

예시

class Point {
	int x;
	int y;

	int getX() {
		return this.x;
	}

	int getY() {
		return this.y;
	}
}
...

arr.sort(Comparator.comparing(Point::getX)
                .thenComparing(Point::getY));
  • getter 구현
  • Comparator.comparing 으로 원하는 필드의 getter 를 넣어준다.
  • 다중 조건일 때에는 .thenComparing 을 이용

방법3. Arrays.sort() 사용

예시

Arrays.sort(arr, (o1,o2) -> {
	if(o1.x == o2.x) {
		return Integer.compare(o1.y, o2.y);
	}
	else {
		return Integer.compare(o1.x, o2.x);
	}
});

물론 배열을 써도 된다. 배열을 쓸 때에는 Arrays.sort(Object[] o, 구현) 형태이다.

BOJ 1181 단어정렬

단어의 길이순 정렬. 같을 때는 사전순으로.
문자열 String 을 정렬하는 문제다.

arr.sort((o1, o2) -> {
	if(o1.length() != o2.length()) return o1.length() - o2.length();
	return o1.compareTo(o2);
});

위의 형식이 익숙해지면 쉽게 풀 수 있는 문제다.
원하는 정렬 기준을 스코프 안에 정의해주면 된다.
이번엔 String이 구현해놓은 compareTo 메서드를 활용해서 풀어줬다.
easy..

제발 헷갈리지 말자.~

방법4. Collections.sort()

이미 정렬 기준이 있을 땐(오버라이딩을 미리 했거나 디폴트 정렬할 땐)
Collections.sort() 를 통해 정렬하면 된다.

Collections.sort(List<T> list);


이정도면 정렬은 어느정도 익혔고,, 여전히 헷갈리는 오름차순, 내림차순 기준을 정해서 리턴할 때,
음수 양수에 관해서 다시 살펴보자.
음수를 리턴하면 오름차순인건 알겠는데 왜 그런지를 로직 이해를 전혀 못하고 있는 나다.

(작성중 .. )

profile
한 발 짝

0개의 댓글