algorithm/BOJ

[BOJ 2910] 빈도 정렬

아르비스 2020. 8. 11. 10:06

https://www.acmicpc.net/problem/2910

 

2910번: 빈도 정렬

문제 위대한 해커 창영이는 모든 암호를 깨는 방법을 발견했다. 그 방법은 빈도를 조사하는 것이다. 창영이는 말할 수 없는 방법을 이용해서 현우가 강산이에게 보내는 메시지를 획득했다. 이 ��

www.acmicpc.net

 

문제가 어렵거나, 구현이 어려운 문제는 아니지만. 제출시 오류가 났다...

한참 오류난 포인트를 찾았는데.. 핵심은 

 

 수열의 두 수 X와 Y가 있을 때, X가 Y보다 수열에서 많이 등장하는 경우에는 X가 Y보다 앞에 있어야 한다. 만약, 등장하는 횟수가 같다면, 먼저 나온 것이 앞에 있어야 한다.

이렇게 정렬하는 방법을 빈도 정렬이라고 한다.

'만약, ~~' 부터가 오류의 원인이다. 수열내 등장한 개수가 같다면. 먼저 등장한 숫자를 먼저 출력해줘야 하는 부분..

이것을 Sort rule에 추가하면 바로 해결됨.

 

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.StringTokenizer;

public class boj2910 {
	static int N, C;
	static class Node implements Comparable<Node>{
		int Num, Count, idx;
		public Node(int num, int count, int idx) {
			this.Num = num;
			this.Count = count;
			this.idx = idx;
		}
		@Override
		public int compareTo(Node o) {
			if(o.Count == this.Count) {
				return this.idx - o.idx;
			}
			return o.Count - this.Count;
		}
	}
	static HashMap<Integer, Node> hm = new HashMap<>(); 
	
	static long[] Num;
	public static void main(String[] args) throws IOException {
		System.setIn(new FileInputStream("res/input_2910.txt"));
		long Start = System.currentTimeMillis();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		
		int n;
		for (int i = 0; i < N; i++) {
			n = Integer.parseInt(st.nextToken());
			if(hm.containsKey(n)) {
				Node nd = hm.get(n);
				nd.Count++;
				hm.put(n, nd);
			} else {
				hm.put(n, new Node(n, 1, i));
			}
		}
		
		ArrayList<Node> list = new ArrayList<>();
		for (Entry<Integer, Node> e : hm.entrySet()) {
			list.add(e.getValue());
		}
		
		Collections.sort(list);
		StringBuffer sb = new StringBuffer();
		for (Node node : list) {
			for (int i = 0; i < node.Count; i++) {
				sb.append(node.Num+" ");
			}
		}
		
		System.out.println(sb.toString());
	}

}