칸반보드 만들기! 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;
}
}