20920번: 영단어 암기는 괴로워 (acmicpc.net)
20920번: 영단어 암기는 괴로워
첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단
www.acmicpc.net
- 길이가 M이상인 단어들만 외움
우선순위
1. 자주 나오는 단어일수록 앞에 배치
2. 해당 단어의 길이가 길수록 앞에 배치
3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치
풀이 과정
getOrDefault
- 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드
- HashMap의 경우 동일 키 값을 추가할 경우 Value의 값이 덮어쓰기가 됨
- 기존 key 값의 value를 계속 사용하고 싶을 경우 getOrDefault 메서드를 사용
getOrDefault(Object key, V DefaultValue)
- key : 값을 가져와야 하는 요소의 키
- defaultValue : 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값
- 반환값 : 찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴틀값이 반환
HashMap 정렬 방법
[Java] HashMap Value 기준으로 정렬하기 (velog.io)
[Java] HashMap Value 기준으로 정렬하기
알고리즘 문제를 풀이하다가 HashMap을 Value 기준으로 정렬해야 할 상황이 생겼다 ! 생각보다 자주 사용될 내용일 것 같아서 이 참에 정리해두려 한다 !먼저 Collections.sort()를 사용하기 위해서 List
velog.io
- Collections.sort()를 사용하기 위하여 List 형태로 Map을 가져와야 함
- Map.entrySet()을 이용하여 Map의 Entry Set을 List 형태로 저장
Map<String, Integer> map = new HashMap<>();
map.put("a", 3);
map.put("b", 2);
map.put("c", 1);
List<Map.Entry<String, Integer>> entryList = new LinkedList<>(map.entrySet());
Comparator 사용
- Comparator 인터페이스를 사용하여 정렬
Map<String, Integer> map = new HashMap<>();
map.put("a", 3);
map.put("b", 2);
map.put("c", 1);
List<Map.Entry<String, Integer>> entryList = new LinkedList<>(map.entrySet());
entryList.sort(new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o1.getValue() - o2.getValue();
}
});
for(Map.Entry<String, Integer> entry : entryList){
System.out.println("key : " + entry.getKey() + ", value : " + entry.getValue());
}
//key : c, value : 1
//key : b, value : 2
//key : a, value : 3
Comparator 정의
[Java 01] Comparator 사용하기 — 코딩배우는 학생🌎 (tistory.com)
[Java 01] Comparator 사용하기
1. Comparator Comparator를 사용하려면 Array나 List Collectons일때 가능하다. 정렬기준을 Arrays.sort()나 Collections.sort()에서 사용가능하다. 내가 정의한 정렬기준에 대해서 배열과 List Collection을 정렬할 수 있
blue-boy.tistory.com
- Comparator를 사용하려면 Array나 List Collections일때 가능
- 정렬 기준을 Arrays.sort()나 Collections.sort()에서 사용
- 사용자가 정의한 정렬 기준에 대해서 배열과 List Collection을 정렬 가능
Comparator<클래스 타입> 클래스명 = new Comparator<클래스 타입>()
- 일반적으로 compare메소드를 오버라이드해서 사용
- 클래스타입 비교 대상 2개를 지역변수 o1,o2로 선언하고 return값으로 음수, 0, 양수를 반환하면서 정렬 가능
ex)
Collections.sort(list,new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
//o1보다 o2의 넘버가 크다면
//no기준 오름차순 정렬
if(o1.getNo()<o2.getNo()) { //1,2,3
return -1;
}
else if(o1.getNo()>o2.getNo()){
return 1;
}
else {
return 0; }
}
});
출처: https://blue-boy.tistory.com/182 [코딩배우는 학생🌎:티스토리]
정답
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Collections;
import java.util.Comparator;
public class Main
{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
HashMap<String,Integer> map = new HashMap<String,Integer>();
StringTokenizer st1 = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st1.nextToken());
int m = Integer.parseInt(st1.nextToken());
for(int i=0; i<n; i++)
{
StringTokenizer st2 = new StringTokenizer(br.readLine());
String word = st2.nextToken();
if(word.length()>=m)
{
map.put(word, map.getOrDefault(word,0)+1);
}
}
List<String> words = new ArrayList<>(map.keySet());
//단어 리스트 정렬
Collections.sort(words, new Comparator<String>()
{
@Override
public int compare(String s1, String s2)
{
//1. 자주 나오는 단어일수록 앞에 배치
if(Integer.compare(map.get(s1), map.get(s2))!=0)
{
return Integer.compare(map.get(s2), map.get(s1));
}
//2.해당 단어의 길이가 길수록 앞에 배치
if(s1.length() != s2.length())
{
return s2.length()-s1.length();
}
//3.알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치
return s1.compareTo(s2);
}
});
for(String w : words)
{
bw.write(w);
bw.newLine();
}
bw.flush();
bw.close();
}
'Java > 백준' 카테고리의 다른 글
[JAVA] 백준 25501 재귀의 귀재 (0) | 2024.02.17 |
---|---|
[JAVA] 백준 10870 피보나치 수 5 (0) | 2024.02.17 |
[JAVA] 백준 26069 붙임성 좋은 총총이 (0) | 2024.02.16 |
[JAVA] 백준 25192 인사성 밝은 곰곰이 (0) | 2024.02.16 |
[JAVA] 백준 1037 약수 (0) | 2024.02.16 |