developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 시계열분석
  • 통계학
  • 운영체제인터럽트
  • BOJ파이썬풀이
  • 삼성코테자바꿀팁
  • 삼성코테기출
  • 카카오코테java풀이
  • 삼성코테자바준비
  • AR모형
  • 삼성코테구현문제추천
  • 삼성코테자바풀이
  • 삼성코테구현풀이
  • 삼성코테파이썬풀이
  • 카카오코테
  • 백준파이썬풀이
  • ARIMA모형
  • 삼성코테파이썬
  • 통계분석
  • Arima
  • 코테파이썬
  • c++디자인패턴
  • 데이터분석
  • 삼성코테파이썬준비
  • MA모형
  • 시계열
  • 삼성코테준비
  • c++ 빌더 패턴
  • SW역량테스트파이썬
  • SW역량테스트파이썬풀이
  • 삼성코테기출자바풀이

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

2022 KAKAO BLIND RECRUITMENT - 주차 요금 계산 (JAVA)

2022. 6. 15. 00:05

❓ 문제 - 2022 KAKAO BLIND RECRUITMENT 주차 요금 계산 - JAVA 풀이법

출처 

(https://programmers.co.kr/learn/courses/30/lessons/92341)

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

 

 

📝 문제해결법 

1. HashMap + 구현을 통해 문제를 해결하였다.

  • inout이라는 HashMap을 통해 Key(차넘버), Value(Park객체 -> time(총 주차한 시간), in_time(차가 주차장에 들어온 시간), isOut(차가 혹시 주차장을 나갔는지체크))로 관리한다.
  • car라는 ArrayList로 차넘버에 대한 정보를 넣고 나중에 answer에 차번호를 오름차순으로 주차비용을 넣기위해 활용한다.
  • str_to_time()이라는 메서드를 통해 hh:mm 상태를 -> 분단위로 바꿔준다.
  • 주차장에 기록을 차례대로 만약 해당 차가 들어온 상태(IN)일 때 만약 처음 들어오는 차인지 아닌지 hashMap에 해당 차번호로 키값이 존재하는지 여부를 체크한다.
  • 처음으로 들어온 차라면 hashMap에 해당 차번호로 생성 및 car에 차번호를 넣어준다.
  • 차가 주차장에 들어옴 처리를 위해 isOut(차가 주차장을 나갔는지 체크)를 false로 변경해주고 차가 들어온 시간을 Park 객체에 변경해준다.
  • 만약 차가 나가는 상태(OUT)이라면 차가 들어온 시간 in_time과 나간 시간 out_time을 빼서 기존 hashMap time(누적 주차 시간)에 더해준다.
  • car라는 리스트를 정렬하면 오름차순으로 차의 번호대로 누적 주차 시간마다  cal_money 함수를 호출하여서 주차 요금을 계산한다.
  • cal_money() 함수에는 문제에서 주어진 그대로 누적 주차 시간(time)이 기본시간 이하라면 기본요금으로, 누적 주차시간이 기본시간 초과라면 단위시간마다 단위요금을 곱해주고 기본요금을 더해서 주차요금을 리턴한다.

 

2. 느낀점

  • 이 문제 코드는 정말 맘에 들지 않는다.. 그래도 두 차례정도 코드를 손봤는데 다른 사람들이 푼 코드를 보면 조금 더 간결하게 푸셨다.. 부럽..
  • 처음에 문제를 체계적으로 설계한 상태에서 프로그래머스에 웹상에서 바로 코딩해서 시간이 많이 걸렸다.. 다음부터 문제를 제대로 읽고 체계적으로 설계하고 한번 테스트 케이스로 검증후에 코드를 작성해야하겠다!
  • 일단 이 문제를 푸면서 느낀 점은 ArrayList를 정렬할 때 Collections.sort를 활용하는데 이 때 String 형태는 정렬을 위해 다른 처리를 해줘야하는줄 알았는데 숫자형 String이라면 숫자처럼 정렬을 해준다는 사실이다!
  • 조금은 객체지향스럽게 코드를 작성해봤는데 이게 과연 코테에서도 좋은 코드인지는 아직까지 의문이다.. 아시는 분 있다면 댓글주세요...ㅎㅎ

 

 

💻 소스코드 

// 2022 KAKAO BLIND RECRUITMENT - 주차 요금 계산
// HashMap + 구현
import java.util.*;

class Solution {
    public static class Park {
		int time = 0;
        int in_time = -1;
        boolean isOut = false;
	}
    
    public int[] solution(int[] fees, String[] records) {
        
         ArrayList<String> car = new ArrayList<String>();
	        HashMap<String, Park> inout = new HashMap<String, Park>();

	        for(int i=0;i<records.length;i++){
	            String[] str = records[i].split(" ");
	            if(str[2].equals("IN")){
	                Park park;
	                int time = str_to_time(str[0]);
	                if(inout.containsKey(str[1])){
	                    park = inout.get(str[1]);
	                } else {
	                    car.add(str[1]);
	                    park = new Park();
	                }
	                park.in_time = time;
	                park.isOut = false;
	                inout.put(str[1], park);
	            } else {
	                int out_time = str_to_time(str[0]);
	                Park park = inout.get(str[1]);
	                int diff = out_time - park.in_time;
	                park.time += diff; 
	                park.isOut = true;
	            }
	        }
	        	int[] answer = new int[car.size()];
	            Collections.sort(car);
	            
	
	            for(int i=0;i<car.size();i++){
	            	String car_num = car.get(i);
	                if(inout.get(car_num).isOut){
	                	answer[i] = cal_money(inout.get(car_num).time, fees);
	                } else {
	                    int in_time = inout.get(car_num).in_time;
	                    int out_time = str_to_time("23:59");
	                    answer[i] = cal_money(inout.get(car_num).time + out_time-in_time, fees);
	                }
	                System.out.println(answer[i]);
	            }
	        
	    
	        

	        return answer;
	    }
	    
	    public static int cal_money(int diff, int[] fees){
	        int money = 0;
	        if(diff > fees[0]){
	            int diff_default = diff - fees[0];
	            if(diff_default % fees[2] == 0){
	                return fees[1] + (diff_default / fees[2]) * fees[3];
	            } else {
	                return fees[1] + ((diff_default / fees[2])+1) * fees[3];
	            }
	        } else {
	            return fees[1];
	        }
	    }
	    
	    public static int str_to_time(String t){
	        String[] str = t.split(":");
	        return Integer.parseInt(str[0]) * 60 + Integer.parseInt(str[1]);
	    }
}

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

2022 KAKAO BLIND RECRUITMENT - 양과 늑대 (JAVA)  (0) 2022.06.21
2022 KAKAO BLIND RECRUITMENT - 양궁대회 (JAVA)  (0) 2022.06.15
2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 (JAVA)  (0) 2022.06.12
2021 KAKAO BLIND RECRUITMENT - 매출 하락 최소화 (JAVA)  (0) 2022.06.09
BOJ - 트리의 지름 1167번 (JAVA)  (0) 2022.06.08
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • 2022 KAKAO BLIND RECRUITMENT - 양과 늑대 (JAVA)
    • 2022 KAKAO BLIND RECRUITMENT - 양궁대회 (JAVA)
    • 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 (JAVA)
    • 2021 KAKAO BLIND RECRUITMENT - 매출 하락 최소화 (JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바