반응형
11-27 20:39
- Today
- Total
Link
개발하는 고라니
[백준] 4358번 : 생태학 본문
반응형
[문자열 + Map]
우선 문제의 입력은 마지막이 특별한 조건이 없으므로 입력받은 값이 Null 또는 공백일 때 입력을 종료한다. 나는 BufferedReader를 썻지만, Scanner를 사용한다면 hasNextLine()을 사용할 수 있을지도 모르겠다.
Map을 이용해서 나무 이름으로 Key를, 그 나무 이름이 나오는 횟수를 Value로 설정하고 값을 계속 업데이트하자. 그러면 해당 나무가 몇 번 이름 불렸는지 알게되는데, 문제에서는 이름 순으로 정렬하라고 했고, 그 때의 백분율을 소수 4자리 수까지 출력하라고 했다. 이 부분은 굉장히 중요하므로 간과하지 말자.
처음에는 소수 4자리라길래
Math.round(map.get(key) * 100.0f * 10000.0f / size) / 10000.0f;
위와 같이 했으나 오답 처리를 받았다. 질문을 죽 본 결과 소수 4자리까지 출력하는 것이지, 반올림 하는 것이 아니라 틀린 것을 깨닫게 되었다. 따라서 Math.round를 사용하지 말고 String.format("%.4f", ....)을 사용해야 한다.
그리고 이름 순으로 정렬하라고 했는데, HashMap은 정렬 기능이 따로 없다. 그래서 Key들을 Set으로 변경 후 Object Array로 바꾸어 정렬해서 이용했다. 코드가 짧으므로 코드와 함께 보면 이해가 더 쉬울 듯 하다.
(Map -> Set -> Array & sort)
# Code </>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
HashMap<String, Integer> map = new HashMap<>();
int size = 0;
while(true){
String word = br.readLine();
if(word == null || word.equals("")) break;
map.put(word, map.containsKey(word) ? map.get(word) + 1 : 1);
size++;
}
Object[] str = map.keySet().toArray();
Arrays.sort(str);
for(Object obj:str){
String key = (String) obj;
String value = String.format("%.4f", (map.get(key) * 100.0f/ size));
sb.append(key).append(' ').append(value).append('\n');
}
System.out.print(sb);
}
}
반응형
'Programming > 백준' 카테고리의 다른 글
[백준] 14496번 : 그대, 그머가 되어 (0) | 2021.03.28 |
---|---|
[백준] 12904번 : A와 B (0) | 2021.03.28 |
[백준] 14621번 : 나만 안되는 연애 (0) | 2021.03.28 |
[백준] 1062번 : 가르침 (0) | 2021.03.28 |
[백준] 6603번 : 로또 (0) | 2021.03.26 |
Comments