백준 4358번, 생태학

95qwer·2022년 5월 21일
0

중복 처리

  • 해시셋
    • HashSet.contains() 속도 : O(1)
    • HashSet.add() 속도 : O(1)

사전 순서 정렬

  • 키 값을 이용한 정렬
  • Collections.sort() - List 자료구조 사용 (편-안한 키 추가)

키 값 관리

  • 사전 순서 정렬 후 해시맵 탐색을 위해 키 값을 따로 관리합니다.

Cnt 클래스 구현

  • 나타난 횟수
    를 멤버 변수로 갖는 클래스입니다. 해시맵에 키 값과 함께 들어가며, 기본 값은 1입니다.

HashSet은 어차피 중복 값을 허용하지 않지만, 중복값이 입력될 시 다른 작업을 하기 위해
HashSet의 contains를 활용합니다.

contains TRUE --> 중복입니다.

중복이면 HashMap에서 해당 key값으로 찾아들어가서
value로 지정된 Cnt 클래스를 가져와 멤버 변수 값을 1 증가시킵니다.

contains FALSE --> 중복되지 않은 값입니다.

keySet / HashSet / HashMap<String, Cnt>에 모두 추가해줘야 합니다.

입력이 끝난 후, keySet을 정렬해줍니다. (기본 사전순 정렬이므로 그냥 넣기만 하면 됩니다.)
이후 이터레이터를 활용하여 keySet을 돌며 해당 키 값에 해당하는 Cnt 클래스를 불러와
백분율과 반올림 작업을 해주면 끝.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.DecimalFormat;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class P4358 {

	static class Cnt {
		public int cnt = 1;

		public Cnt() {
		}

		int getCnt() {
			return this.cnt;
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
		String key = null;
		HashSet<String> hSet = new HashSet<String>();
		HashMap<String, Cnt> hMap = new HashMap<>();
		List<String> keySet = new LinkedList<>();
		int total = 0;
		while (true) {
			key = bfr.readLine();
			if (key == null || key.length() == 0)
				break;

			total++;

			if (hSet.contains(key))
				hMap.get(key).cnt++;
			else {
				hSet.add(key);
				hMap.put(key, new Cnt());
				keySet.add(key);
			}
			key = null;
		}

		Collections.sort(keySet);
		Iterator<String> it = keySet.iterator();
		DecimalFormat df = new DecimalFormat("0.0000");
		while (it.hasNext()) {
			String hMapKey = it.next();
			bfw.write(hMapKey);
			bfw.write(" ");
			bfw.write(df.format(hMap.get(hMapKey).cnt / (double) total * 100));
			bfw.write("\n");
		}
		bfw.flush();
		bfw.close();
		bfr.close();
	}
}
profile
한땀한땀오타없이

0개의 댓글