[백준] 1811번 : 단어 정렬

letsbebrave·2021년 12월 3일
0

codingtest

목록 보기
7/146

문제

느낀점

모르겠을 땐, 바로 해답을 찾아보지 않더라도 문제해결을 위해 반드시 필요한 개념은 찾아보면서 하는 게 좋을 것 같다. 오히려 필수개념을 지금은 숙지하고 이해하는 것에 시간을 쏟는 게 나을 듯 싶다. 혼자 고민해서 문제가 바란 방향과 달리 가는 게 그리 좋은 방법은 아닌 것 같다. (특히 개념 숙지가 부족한 지금은 재료를 더 쌓을 때이다)
아니 이렇게 풀린다고?
필요한 개념이 꽤 어려워서 아래 달아놓은 블로그들의 정리 내용을 이해하고 다시 풀어보려고 한다.

필수개념

이번 문제는 기본적으로 Array.sort() 메소드와 compare메소드를 정확히 이해하고 있어야 풀 수 있는 문제이다. 나는 정확히 이해하고 있지 못했기에 참 어렵게 어렵게 풀려고 하다가 못 풀었다.

깨고 부딪힌 흔적

package december_first;

import java.util.List;
import java.util.HashMap;  // 꼭 넣어주기
import java.util.LinkedList;
import java.util.Map; // 꼭 넣어주기
import java.util.Scanner;

public class baek_1181 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		int num = sc.nextInt();
		
		//sc.next(); ?
		
		// 인덱스, 단어 해쉬맵 생성
		Map<Integer, String> map = new HashMap<>();
		
		// 인덱스, 단어 해쉬맵 입력
		for (int i = 0; i < num; i++) {
			
			map.put(i, sc.next()); // 왜 sc.nextLine()로 하면 안 됐지?
			
		}
		
		sc.close();
		
		// 인덱스, 단어길이 해쉬맵 생성 (인티저, 인티저 주의)
		Map<Integer, Integer> lengthMap = new HashMap<>();
		
		System.out.println(map.get(0));
		
		// 인덱스, 단어길이 해쉬맵 입력
		for (int i = 0; i < num; i++) {
					
			lengthMap.put(i, map.get(i).length());
			System.out.println(lengthMap.get(i));
		}
		
		
		// 단어길이 해쉬맵 value순으로 오름차순 정렬
		List<Map.Entry<Integer, Integer>> entryList = new LinkedList<>(lengthMap.entrySet());
		
		entryList.sort(((o1, o2) -> lengthMap.get(o1.getKey()) - lengthMap.get(o2.getKey())));
		
		for(Map.Entry<Integer, Integer> entry : entryList){
		    System.out.println("key : " + entry.getKey() + ", value : " + entry.getValue());
		}
				
		// 사진 1
		
		// 인덱스, 단어 해쉬맵 생성
		Map<Integer, String> result = new HashMap<>();
		
		// 반복문 돌려서 단어길이 같은 게 있으면 map에서 단어 가져와서 비교해주기
		for(int i = 0; i < num; i++) {
			
			int num1 = 5;
			
			if (entryList.get(i) == entryList.get(i+1)) {
				num1 = map.get(i).compareTo(map.get(i+1));
			}
			
			if (num1 == 5) {
				result.put(i, map.get(entryList.get(i)));
			}
			
			if (num1 == 1) {
				
			}
		}
		
		
		
		
	}

}

사실 저기까지 푸는 것에 단어들의 갯수 순으로 나열해주는 것엔 성공했다.

그러나 문제는 바로 단어들의 갯수가 같을 때 사전순으로 정렬해주는 것이었다.

단어들의 갯수가 한 번 같을 때는 어찌저찌 사전 순으로 정렬해줄 수 있다 해도, 단어들의 갯수가 계속 같을 때,

예를 들어 총 단어의 갯수가 4개인데
love
hope
you
make
이렇게 되어 있으면 love와 hope와 make는 계속 사전순으로 정렬해주어야 하는 것이 된다. 따라서 쉽지가 않다....

필수 개념 정리된 블로그

Comparable과 Comparator의 이해
https://st-lab.tistory.com/243
단어정렬 풀이
https://st-lab.tistory.com/112
유사문항인 좌표정렬 문제
https://st-lab.tistory.com/110#%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

이 분의 블로그에 들어가면 이 문제를 푸는 데 꼭 필요한 Arrays.sort()를 사용자에 의해 구현하는 방법이 나와 있다.
시간을 꽤 많이 들여야 하는 부분 같다. 이해를 다 하고 문제를 다시 풀어보자!!!

HashMap을 Value 기준으로 정렬하는 법

https://velog.io/@cgw0519/Java-HashMap-Value-%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0

이 분 블로그에서 참고해서 문제를 풀었다.

Array.sort()에 대한 기본적인 정리

https://coding-factory.tistory.com/549
이 분 블로그에서 참고해서 sort()에 대해 알아보았다. 그러나 hashMap을 쓰는 것으로 방향을 바꾸면서 사용하진 않았다.

profile
그게, 할 수 있다고 믿어야 해

0개의 댓글