풀이 과정
1. 데이터 저장할 Map<String , Integer>
2. 만약 Map에 포함 되어있으면 value 꺼내서 ++ 후 다시 저장 -> 함수 mapContains
3. 백분율 계산 -> 함수 speciePercent 사용
4. 문제 틀림 이유 분석
4-1. while문을 나오지못해서 무한루프가 되는가? -> notBlank로 해결
4-2. mapContains 함수에서 값이 제대로 저장되지 않는가? -> 잘 저장됨.
4-3. speciePercent 에서 소수점 계산이 잘못되었는가?
math.round() 와 String.format 중 math.round를 선택했는데 String.format을 사용하니 맞았다.
그럼 String.format과 math.round()의 차이점을 뭘까
맨처음엔 speciePercent 만들어 Math.round()를 사용했다.
public static Map<String, Double> speciePercent(Map<String, Double> map,List<String> mapKey , int count){
for(String key: mapKey){
double percentage = 0;
percentage =(Math.round((map.get(key)*100 / count)*10000)/10000.0);
map.put(key,percentage);
}
return map;
}
그 이유로는 main에서 for문을 돌려 값을 StringBuilder에 넣는것은 별로 안이쁘다고 생각했기 때문이다.
그리고 main에서 어쨌든 값을 뽑긴해야하는데 Map<String, Integer> -> Map<String, Double>로 바꾸고
함수에서 미리 계산해서 다 저장후 뽑아 낼때 계산없이 그냥 출력만하게 하면 코드 유지보수가 용이하고 시간을
좀더 단축할것이라 예상하고 했다.
String.format vs math.round()
공통 : 실수를 소수점 N번째까지 잘라서 표현.
String.format() 은 소수점아래가 0이라도 그대로 리턴
math.round() 소수점 아래가 0일 경우 모두 없애버린다.
고로 math.round()를 했을때 만약에 퍼센트가 25.0000%로 똑같이 나눠졌다면
math.round() -> 25(double)
String.format() -> 25.0000(String)
문제요구는 무조건 소수점 넷째자리까지 출력하라고 했으므로 틀린것이었다.
String.format()은 String이므로 이미 만든 map에 저장하여 출력할 수 없으므로 함수를 지우고
main에서 계산 후 바로 출력했다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
/*
* 데이터 저장할 Map<String , Integer>
* 만약 Map에 포함 되어있으면 value 꺼내서 ++ 후 다시 저장 -> 함수 mapContains
* 백분율 계산 -> 함수 speciePercent -> 번거로움으로 삭제
* Math.round() -> String.format() 사용
*/
public class backJoon4358 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Boolean notBlank = true;
int count = 0;
Map<String, Integer> map = new HashMap<>();
while(notBlank){
String input = br.readLine();
if(input == null || input.equals("")) notBlank = false;
else{
count++;
if(!mapContains(map,input)){
map.put(input,1);
}
}
}
List<String> mapKey = new ArrayList<>(map.keySet());
Collections.sort(mapKey);
for(String key: mapKey){
int values = map.get(key);
double per = (double)(values * 100.0) / count;
System.out.println(key + " " + String.format("%.4f", per));
}
}
public static Boolean mapContains(Map<String, Integer> map, String input){
Boolean containsKey = false;
if(map.containsKey(input)){
int value = map.get(input);
value++;
map.put(input, value);
containsKey = true;
}
return containsKey;
}
}
'[BOJ]' 카테고리의 다른 글
[JAVA] 21939 문제 추천 시스템 Version 1 (0) | 2023.03.26 |
---|---|
[JAVA] 11286 절대값 (0) | 2023.03.23 |
[BOJ] 2075 N번째 큰 수 (0) | 2023.03.21 |
[Java] 최대 힙 (0) | 2023.03.20 |
[JAVA] 14425 문자열 집합 (0) | 2023.03.20 |