-
2910번: 빈도 정렬
첫째 줄에 메시지의 길이 N과 C가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ C ≤ 1,000,000,000) 둘째 줄에 메시지 수열이 주어진다.
www.acmicpc.net
문제
해당 문제는 입력으로 주어진 수열에 빈도를 정렬해서 출력해주는 문제다.
조건
가장 많이 있는 순서대로 출력해준다. 만약 빈도수가 같다면 먼저 들어온 순서로 출력한다.
풀이
해당 문제는 map를 이용했고, 정렬에 관련해서는 람다식을 이용해서 해결했다.
먼저 수열을 입력받으면 map에 빈도수를 저장해준다. 이때 일반 map가 아닌 LinkedHashMap을 이용했다.
(LinkedHashMap은 들어온 수서대로 정렬되기 때문)
빈도수는 getOrDefault를 이용했고, 해당 키값이 존재하면 벨류를 반환하고 아니면 우리가 지정한 값을 반환한다.
이후 정렬을 해줘야 하는데 map를 정렬하지 못해 리스트에 map의 키값을 넣어주고, 람다식을 이용해 빈도수로 정렬을 해준다.
이후 리스트의 크기만큼 반복문을 돌리면서 키값에 대응되는 빈도수만큼 키를 출력해주면 된다.
지금 생각해보면 foreach문을 썼다면 더 이뻤을 거 같기도...?
코드
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int N = Integer.parseInt(st.nextToken()); int C = Integer.parseInt(st.nextToken()); Map<Integer, Integer> map = new LinkedHashMap<>(); st = new StringTokenizer(br.readLine()); for (int i = 0; i < N; i++) { int n = Integer.parseInt(st.nextToken()); map.put(n, map.getOrDefault(n, 0)+1); // 빈도수 저장 존재하면 이미 있는값 +1 아니면 0+1 } ArrayList<Integer> list = new ArrayList<>(map.keySet()); // 정렬을 위해 키값을 기준으로 리스트로 만들어줌 list.sort((a,b) -> map.get(b)-map.get(a)); // value값에 따라 내림차순 정렬 for (int i = 0; i < list.size(); i++) { // list 크기만큼 반복하면서 출력 for (int j = 0; j < map.get(list.get(i)); j++) { // 키값에 대응되는 벨류값만큼 반복돌면서 System.out.print(list.get(i)+" "); // 키값을 출력 } } } }
GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드
JAVA 소스 코드. Contribute to JUNGSOONIL/JAVA development by creating an account on GitHub.
github.com
728x90'알고리즘 > Baekjoon' 카테고리의 다른 글
Baekjoon 8911 거북이 JAVA (0) 2022.01.16 Baekjoon 2002 추월 JAVA (0) 2022.01.13 Baekjoon 14442 벽 부수고 이동하기 2 JAVA (0) 2022.01.11 Baekjoon 17391 무한부스터 JAVA (0) 2022.01.10 Baekjoon 15664 구슬 탈출 3 JAVA (0) 2022.01.09 댓글