본문 바로가기

Java/백준

[JAVA] 백준 20920 영단어 암기는 괴로워

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();

    }