일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준 1197번 최소 스패닝 트리 - java
- 백준 3190번
- 백준 14938번 서강그라운드
- 백준 2473번 세 용액 - java
- map
- 백준 1806번 부분합 java
- kotlin
- 프로그래머스 자바
- 최소 힙 1927
- 백준 2467번 용액 자바 - 이분탐색
- append
- dp
- 프로그래머스
- StringTokenizer
- 코틀린기초
- toUpperCase
- StringBuilder
- HashSet
- 백준 1043번 거짓말 - java 분리 집합
- hash
- mysql hy000 에러
- Java
- 18111번 마인크래프트 - java 구현
- Stack
- HashMap
- replace()
- ac 5430번
- 프로그래머스 java
- 백준 1647번 도시 분할 계획 - java
- 백준 1541
Archives
- Today
- Total
말하는 컴공감자의 텃밭
백준 1181번 단어정렬 S5 - Comparable 인터페이스 본문
728x90
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
간단했으나 Compare 인터페이스의 Sort를 이용할때 문자열의 길이도 고려하며 정렬해야했다.
Sort 함수 Override이 필요하다고 판단했으나 사용법이 헷갈려 검색을 활용했다.
자바에서 객체를 비교하는 방법은 Comparable 인터페이스를 구현하거나 Comparator 인터페이스를 이용하는 두 가지 방법이 있다.
- Comparable
- compareTo를 활용해서 요소를 비교하는데 메서드를 통해 인자로 넘어온 같은 타입의 다른 객체와 대소 비교를 한다. 메서드를 호출하는 객체가 인자로 넘어온 객체보다 작을 경우에는 음수를 리턴하고, 크기가 동일하다면 0, 클 경우에는 양수를 리턴해야하는 특징이 존재한다.
public class Player implements Comparable<Player> {
// Fields, Getters, Setters 생략
@Override
public int compareTo(Player other) {
return other.getScore() - this.getScore();
}
}
List<Player> players = new ArrayList<>();
// ... (플레이어 객체 추가)
Collections.sort(players);
플레이어의 점수의 경우 숫자만 비교하면 되므로 간단하게 정렬이 된다.
하지만 다른 기준으로 정렬하고 싶다면 Comparator 을 사용해야한다.
- Comparator
- ****정렬하고자 하는 객체의 클래스에 Comparable 인터페이스를 구현할 수 없을 때 사용하는 방법이다 혹은 Comprable 인터페이스를 통해 이미 정렬기준이 정해져있지만 다른 기준으로 정렬하고 싶을때 사용하는 방법이다.
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
sort 함수를 까보면 첫번째로 정렬 할 리스트와 두번째 기준인 Comparator를 받는다.
// sorting 길이를 비교하기 위해 Override
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.length() == o2.length()){
return o1.compareTo(o2);
}else {
return o1.length() - o2.length();
}
}
})
그렇다면 Comparator<String> 인터페이스의 compare 메서드를 재정의해주어 새로운 기준인 length()를 넣어 o1, o2의 길이를 비교하여 더 큰 값을 return해주게 만들어 주면 된다.
여기서 람다를 활용 할 수 있는데
Java의 람다 표현식은 단일 메서드 인터페이스(기능 인터페이스)의 인스턴스를 표현하는 간결한 방법을 제공합니다. 기능적 인터페이스는 하나의 추상 메서드만 포함하고 람다 식의 대상으로 사용할 수 있는 인터페이스입니다.
정리하면 Java 8 이후로 코드를 간결하게 만들 수 있고 의도가 바로 보여 가독성이 좋아지기에 사용되는 방식이다.
// 람다식으로 작성
Arrays.sort(arr, (o1, o2) -> {
if (o1.length() == o2.length()) {
return o1.compareTo(o2);
} else {
return o1.length() - o2.length();
}
});
간결하게 수정이 되었다.
최종 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import java.util.*; import java.io.*; public class Main { // 1181번 문자열 정렬하기 public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); HashSet<String> set = new HashSet<>(); int N = Integer.parseInt(br.readLine()); for(int i = 0; i<N; i++) { set.add(br.readLine()); } int size =set.size(); String [] arr = new String[size]; set.toArray(arr); //람다식 사용 Arrays.sort(arr, (o1, o2) -> { if (o1.length() == o2.length()) { return o1.compareTo(o2); } else { return o1.length() - o2.length(); } }); for(String s : arr) { sb.append(s); sb.append("\n"); } System.out.println(sb); } } | cs |
728x90
'알고리즘 > Backjoon - Java' 카테고리의 다른 글
백준 11052번 카드구매하기 S1 - DP (0) | 2024.01.19 |
---|---|
백준 15721번 번데기 S5 - Brute force (0) | 2024.01.15 |
백준 12865번 평범한 배낭 G5 - DP (0) | 2023.12.19 |
백준 3085번 사탕 게임 S2 - 브루트포스 (0) | 2023.12.14 |
백준 2579번 계단 오르기 S3 - DP (0) | 2023.12.12 |
Comments