프로그래머스 lv2 주차 요금 계산

namkun·2022년 10월 4일
1

코딩테스트

목록 보기
47/79
post-custom-banner

문제 링크

주차 요금 계산

풀이

  • "그냥 생각없이 하니까 풀렸다"
  • 말 그대로 무식하게 반목문 돌면서 조건대로 계산하고, 결과를 따로 받게 하였더니 풀렸다.
  • 코드가 아주 더럽다. 한 번 리팩토링을 해야겠지만 지금은...
  • Stream을 연습해본답시고 많이 써봤는데 아직도 헤맨다...더 자주 써서 내걸로 만들어야겠다.
    public static int[] solution(int[] fees, String[] records) {
        Map<String, Integer> recordMap = new HashMap<>();
        Map<String, Integer> resultMap = new HashMap<>();
        
        Arrays.stream(records)
        	  .map(record -> record.split(" "))
        	  .forEachOrdered(recordArr -> {
            String recordTime = recordArr[0];
            int time = Integer.parseInt(recordTime.split(":")[0]) * 60 + Integer.parseInt(recordTime.split(":")[1]);
            if (recordArr[2].equals("IN")) {
                recordMap.put(recordArr[1], time);
            } else {
                if (resultMap.containsKey(recordArr[1])) {
                    resultMap.put(recordArr[1], resultMap.get(recordArr[1]) + (time - recordMap.get(recordArr[1])));
                } else {
                    resultMap.put(recordArr[1], time - recordMap.get(recordArr[1]));
                }
                recordMap.remove(recordArr[1]);
            }
        });

        if (recordMap.size() > 0) {
            recordMap.keySet()
                     .forEach(number -> resultMap.put(number, resultMap.getOrDefault(number, 0) + (FINAL_TIME - recordMap.get(number))));
        }

        List<Integer> resultFee = new ArrayList<>(); // Array로 받았어도 될 듯
        int defaultTime = fees[0];
        int defaultFee = fees[1];
        int unitTime = fees[2];
        int unitFee = fees[3];
        resultMap.keySet().stream()
         				  .sorted()
                          .map(resultMap::get)
                          .forEachOrdered(sumOfTime -> {
                                if (sumOfTime <= defaultTime){
                                    resultFee.add(defaultFee);
                                } else {
                                    resultFee.add(defaultFee + ((int) Math.ceil((sumOfTime - (double) defaultTime) / unitTime)) * unitFee);
                                }
        });

        return resultFee.stream()
        				.mapToInt(Integer::intValue)
                        .toArray();
    }
profile
개발하는 중국학과 사람
post-custom-banner

0개의 댓글