젬니
Jemin IT블로그
젬니
전체 방문자
오늘
어제
  • 분류 전체보기 (189)
    • [Engineering] (3)
    • [PGS] (8)
    • [BOJ] (20)
    • [백엔드] (3)
    • [DevOps] (14)
    • [Django] (2)
    • [ Algorithm] (33)
    • [SqL] (12)
    • [Techit] (6)
    • [InteliJ 설정] (0)
    • [CS 공부] (42)
    • [DB] (22)
    • [TDD] (1)
    • [NCP] (4)
    • [for Rest 프로젝트] (11)
    • [Kotlin] (3)
    • [비공개 공부] (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 햣

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
젬니

Jemin IT블로그

[BOJ]

[JAVA] 4358 생태학

2023. 3. 21. 17:07

풀이 과정

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
    '[BOJ]' 카테고리의 다른 글
    • [JAVA] 21939 문제 추천 시스템 Version 1
    • [JAVA] 11286 절대값
    • [BOJ] 2075 N번째 큰 수
    • [Java] 최대 힙
    젬니
    젬니

    티스토리툴바