23-07-10 TIL

more·2023년 7월 10일
0

문제

  • 집에서 아침부터 저녁 시간 조금 지나서까지 화장실 공사를 진행하였기 때문에 인강을 듣지 못해서 알고리즘 문제라도 하나 풀어보고자 하였다.
    • 처음에는 각각의 리스트를 따로 만들어서 빈도수, 길이, 알파벳의 리스트를 만들고 해당하는 길이 이상의 단어들끼리 비교를 해보려하였다.

시도

  • 그렇게 시도를 하자, 마지막 출력하는 부분에서 조금 어려움이 느껴졌다.
    • 리스트 별로 따로 조건을 저장하는 것은 괜찮으나, 쌍으로 이루어진 부분이 없어서 비교하여 출력하기가 애매했다.
    • 또한 이렇게 문제를 해결한다면 배운 부분이 없이 그저 예전과 똑같은 방식으로 기계적으로 문제를 푼다는 느낌이 들어서, 여러가지 다른 시도를 해보기로 하였다.

해결

  • 우선은 쌍으로 이루어진 부분을 얻기 위해서 Map을 사용하여서 단어와 빈도수를 저장하였다.
    • 이 부분은 예전에 새로 Map을 배웠을 당시 사용해보았던 부분이다.
    • 그리고 또 stream과 람다를 사용해보고자 생각하여서, 반복문으로 key에 해당하는 value를 리스트에 저장해도 좋지만, collect를 검색해서 사용해보았다.
    • 또한 sort를 할 때에, 따로 함수를 만들어서 사용해도 좋지만 람다 부분을 잘 몰라서 한번 사용해보고자 검색해서 사용해보았다.

오늘 푼 문제

  • 백준 20920 (영단어 암기는 괴로워) - Java
    • 처음에는 각 케이스 별로 하나하나 나눠서 각각의 리스트를 만든 다음에 비교하는 방식을 사용하려고 하였으나, 그렇게 하면 출력을 할 때 복잡해진다는 것을 다 만들고 깨달았다.
    • 아예 하나의 컬렉션만 사용하고, 그 안에서 순서까지 만들었으면 좋겠다라는 생각이 들어서 Map을 사용하게 되었다.
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;

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

        StringTokenizer st = new StringTokenizer(br.readLine());

        int word = Integer.parseInt(st.nextToken());

        int limitLength = Integer.parseInt(st.nextToken());

        Map<String, Integer> wordMap = new HashMap<>();

        for(int i = 0; i < word; i++){
            String tmp = br.readLine();

			// limitLength 이상의 길이를 가진 단어만 저장
            if(tmp.length() >= limitLength) {

                Integer count = wordMap.getOrDefault(tmp, 0);
                wordMap.put(tmp, count + 1);
            }
        }

		// 데이터를 List 형식으로 변환시키기 위해서 collect를 사용하였다.
        // Map -> List (키 값만 각각 반복문으로 할당하는 것 보다 stream을 사용해보고자 하였음
        List<String> saveWords = wordMap.keySet().stream().collect(Collectors.toList());

		// 
        saveWords.sort((o1, o2) -> {
            int c1 = wordMap.get(o1);
            int c2 = wordMap.get(o2);
			// 빈도수가 같다면
            if (c1 == c2){
            	// 길이가 같다면
                if (o1.length() == o2.length()) {
                	// 알파벳순으로 (앞에 있는 단어가 앞에)
                    return o1.compareTo(o2);
                }
                // 빈도수는 같지만 길이는 다름 (길이가 길수록 앞)
                return o2.length() - o1.length();
            }
            // 빈도수가 다르면 높을 수록 앞
            return c2 - c1;
        });

        for (int i = 0; i < saveWords.size(); i++) {
            bw.write(saveWords.get(i) + "\n");
        }

        bw.flush();
        bw.close();
        br.close();
    }
}
  • getOrDefault(Object key, V DefaultValue)
    • 반환 값 : 찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환

0개의 댓글