문제 내용은 문자열을 받은 뒤 빈도 수에 따라 출력으로 깔아주면 되는데, 빈도 수가 동일할 경우에는 먼저 들어온 값이 우선해서 나가야 한다.
첫째 줄에 있는 두 번째 값은 N 이하의 숫자만 들어온다고 하는데 로직 상 아무 의미가 없기 때문에 들어오는 숫자 갯수만 봐주면 되겠다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split(" ");
int[] arr = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
for (int i : arr) {
map.merge(i, 1, Integer::sum);
}
List<Entry<Integer, Integer>> entries = new ArrayList<>(map.entrySet());
entries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
StringBuilder sb = new StringBuilder();
for (Map.Entry<Integer, Integer> entry : entries) {
int val = entry.getValue();
for (int i = 0; i < val; i++) {
sb.append(entry.getKey()).append(" ");
}
}
System.out.println(sb.substring(0, sb.length() - 1));
}
}
문제를 풀어보자면, 먼저 입력받은 값들의 빈도 수를 확인해야 하기 때문에 중복이 되지 않는 Map을 사용해서 빈도에 해당하는 Value만 1씩 늘려 나가면서 삽입하되, 삽입 순서대로 순서를 보장해주는 LinkedHashMap을 사용해주자
이후에는 Map에 담았던 내용을 List<Entry>> 형태로 옮겨 담아준 후 Entry의 값을 기준으로 정렬시켜주면
Map의 Value 순, 삽입 순으로 정렬이 되게 되는데
이후에는 list를 돌려 값을 꺼내주면서 빈도 수 만큼 StringBuilder에 붙여주면 되고 이후 StringBuilder에 모두 붙여주고 난 뒤에는 맨 끝에 공백 붙어있는지 확인하고 제거해준 후 출력해주면 끝이다.
Leave a Reply