일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 코틀린기초
- 백준 2467번 용액 자바 - 이분탐색
- 백준 2473번 세 용액 - java
- StringBuilder
- Java
- 백준 3190번
- 프로그래머스
- hash
- 백준 14938번 서강그라운드
- append
- 18111번 마인크래프트 - java 구현
- 프로그래머스 java
- dp
- 백준 1541
- toUpperCase
- kotlin
- 백준 1647번 도시 분할 계획 - java
- replace()
- StringTokenizer
- 백준 1806번 부분합 java
- 최소 힙 1927
- map
- HashMap
- 백준 1197번 최소 스패닝 트리 - java
- HashSet
- mysql hy000 에러
- Stack
- 프로그래머스 자바
- 백준 1043번 거짓말 - java 분리 집합
- ac 5430번
Archives
- Today
- Total
말하는 컴공감자의 텃밭
백준 20920번 영단어 암기는 괴로워 <S3> - HashMap 본문
728x90
조건을 정리하면 M의 길이보다 작은건 제외, 자주나올수록, 단어가 길 수록 앞으로.
사전순으로 정리하면 된다.
단어는 1번만 나오게 해야하니까 Hash 구조를 쓰고, 얼마나 나왔는지 확인도 필요하므로 HashMap구조를 사용했다.
단어를 키로, 나온 수를 값으로 가져줬다.
그럼 뭐 쉽죵
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { // Line으로 받아서 n m 을 토큰으로 받아줌 BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(bf.readLine()); int n = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken()); // Input // 먼저 M 미만은 무시하고, 리스트에 저장, 정렬 후 빈도수 및 길이 비교로 재정렬 Map<String, Integer> map = new HashMap<>(); for (int i = 0; i < n; i++) { String str = bf.readLine(); if (!(str.length() < m)) { map.put(str, map.getOrDefault(str, 0) + 1); } } // 리스트에 단어 넣어두기 List<String> word = new ArrayList<>(map.keySet()); // 우선 순위에 따라 비교 람다 활용해서 compareTo 구현 word.sort((o1, o2) -> { int c1 = map.get(o1); // 빈도수 int c2 = map.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 < word.size(); i++){ bw.write(word.get(i) + "\n"); } bw.flush(); bw.close(); } } | cs |
기존에 편해서 scanner을 쓰고있는데 입력값이 워낙에 커서 버퍼리더로 받아줬다.. 얼른 습관 고쳐야하는데
코테보는 이후로 바로 고쳐 볼 예정이다
728x90
'알고리즘 > Backjoon - Java' 카테고리의 다른 글
백준 1912번 연속합 <S2> - 수학 (0) | 2023.11.04 |
---|---|
백준 2108번 통계학 <S3> - 수학 (0) | 2023.11.03 |
백준 18429번 근손실 <S3> - 브루트 포스 (0) | 2023.10.30 |
백준 26069번 붙임성 좋은 총총이 <S4> - Hash set (1) | 2023.10.27 |
백준 25192번 인사성 밝은 곰곰이 <S4> - Hash (0) | 2023.10.26 |
Comments