[TIL] 20240103

Xtraa·2024년 1월 3일
0

TIL

목록 보기
33/99

Team KPT

칸반보드 만들기! GitHub

Keep

  • 직접 매핑과 쿼리문 작성을 통해 이론적인 지식을 실전에 적용하며 확실히 이해하는 경험을 할 수 있었습니다.

  • 프로젝트를 통해 배운 내용을 실제로 적용해보고, 이를 통해 지식이 실전에서도 확실히 쌓이는 것을 느낄 수 있었습니다.

  • 팀원 간의 원활한 소통과 협업으로 인해 특별히 어려운 점 없이 프로젝트를 진행할 수 있었습니다.

Problem

  • CRUD 기능을 넘어서 복잡해지는 요구 사항에 대응하기 위해 쿼리를 직접 작성하고 로직을 구성하는 과정이 어려웠습니다.

  • 다대다 매핑과 예외 처리 로직을 추가하면서 발생하는 복잡성을 효율적으로 관리하는 데 어려움을 겪었습니다. 심플해 보이는 기능 구현이지만 직접 구현해 보면 예상치 못한 다양한 측면을 고려해야 하는 점이 힘들었습니다.

Try

  • 잘못된 URL 입력으로 인한 문제를 찾는 데 많은 시간을 소모하고, 이를 통해 Swagger 사용의 중요성을 느꼈습니다.

  • Entity들과 그들 간의 연관 관계가 많아지고 복잡해지면서, 이를 설정하는 부분에서 초기 프로젝트 설계의 중요성을 깨달았습니다.

  • 테스트코드와 배포, 프론트엔드 구현 부분을 시도만 해보고 완성하지 못한 것이 아쉬웠고 꼭 구현해보고 최종프로젝트 진행 해보겠다고 생각했습니다.


프로그래머스 코딩테스트

주차 요금 계산

import java.util.*;

class Solution {
    public int[] solution(int[] fees, String[] records) {
        HashMap<String, Integer> inTime = new HashMap<>(); // 입차 기록
        TreeMap<String, Integer> result = new TreeMap<>(); // 누적 주차 시간
        int time = 0;
        int hour = 0;
        int min = 0;
        
        for (String s : records) {
            String[] str = s.split(" "); // [0] 시각, [1] 차량 번호, [2] 내역
            
            String[] strTime = str[0].split(":"); // hour -> min 변환, [0] 시, [1] 분
            hour = Integer.parseInt(strTime[0]);
            min = Integer.parseInt(strTime[1]);
            time = hour * 60 + min;
            
            if (str[2].equals("IN")) {
                inTime.put(str[1], time);
                if (result.containsKey(str[1]) == false) {
                    result.put(str[1], 0);
                }
            }
            if (str[2].equals("OUT")) {
                // value : 누적 주차 시간 + (OUT 시각 - IN 시각)
                result.put(str[1], result.get(str[1]) + (time - inTime.get(str[1])));
                inTime.remove(str[1]);
                }
            }
        
        // 나가지 않은 차량
        for (Map.Entry<String, Integer> entry : inTime.entrySet()) {
            String carNum = entry.getKey();
            int inTimeValue = entry.getValue();
            result.put(carNum, result.get(carNum) + ((23 * 60 + 59) - inTimeValue));
        }
        
        int defTime = fees[0]; // 기본 시간
        int defFee = fees[1];  // 기본 요금
        int unitTime = fees[2]; // 단위 시간
        int unitFee = fees[3];  // 단위 요금
        
        int[] answer = new int[result.size()];
        
        int idx = 0;
        for (Integer parkingTime : result.values()) {
            int fee = defFee;
            // 기본 시간 초과 시 추가 요금 계산
            if (parkingTime > defTime) {
                int extraTime = parkingTime - defTime;
                fee += Math.ceil((double) extraTime / unitTime) * unitFee;
            }

            answer[idx++] = fee;
        }
        
        return answer;
    }
}
  • 먼저, 차량의 입차 기록과 누적 주차 시간을 저장하기 위해 HashMap 'inTime'과 TreeMap 'result'를 선언합니다.
  • records 배열을 순회하며 각 기록을 분석합니다. 기록은 "시각 차량번호 내역" 형태로 되어있습니다. 시간은 시와 분으로 이루어져 있으므로 이를 분으로 변환합니다.
  • 차량의 입차 기록('IN')이면, 해당 차량의 입차 시간을 'inTime'에 저장하고, 'result'에 차량 번호를 키로 하는 누적 주차 시간을 0으로 초기화합니다.
  • 차량의 출차 기록('OUT')이면, 해당 차량의 누적 주차 시간을 (현재 시각 - 입차 시각)으로 업데이트하고, 입차 기록을 삭제합니다.
  • 모든 기록이 끝난 후, 아직 출차하지 않은 차량에 대해 23시 59분까지의 주차 시간을 추가로 누적합니다.
  • 주차 요금을 계산합니다. 주차 시간이 기본 시간을 초과하면 추가 요금을 계산합니다. 추가 요금은 초과 시간을 단위 시간으로 나눈 값(올림 처리)에 단위 요금을 곱한 값입니다.
  • 모든 차량의 주차 요금을 'answer' 배열에 저장하고, 이를 반환합니다.
profile
https://xtraa.notion.site/Xtraa-ed48ac432d354d01b5bf5b0da5ec94a9?pvs=4

0개의 댓글