알고리즘/구현

2022 KAKAO BLIND RECRUITMENT - 주차 요금 계산

naksnaks 2022. 6. 5.
반응형

[문제링크]

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) Set을 이용하여 차량 번호를 중복없이 저장하였습니다.

2) List<Parking>을 만들어 hour와 minute를 minute에 합쳐 저장하였습니다.

3) Map<String, Integer>를 이용해 해당 차량 번호와 요금을 저장하였습니다. 또한, Map<String, Boolean>을 이용해 해당 차량 번호와 가장 마지막의 상태가 IN인지 OUT인지를 확인하였습니다.

4) 만약 visited가 false일 경우, 해당 위치에서 하나씩 전으로 돌아가며 해당 차량번호가 IN할때의 시간을 찾습니다.

5) 원래의 요금과 방금 시간의 차를 합쳐 3)에 저장합니다.

6) 모든 List를 돌았지만, visited가 IN일 경우 23:59에 출차한 것으로 적용합니다.

7) fees를 이용하여 요금이 얼마나 나오는지 출력합니다.

 

 

프로그래머스 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 JAVA풀이

 

import java.util.*;

class Solution {
    public int[] solution(int[] fees, String[] records) {
        
        Set<String> set = new TreeSet<>();
        List<Parking> list = new LinkedList<>();
        for(int i=0;i<records.length;i++){
            String[] s = records[i].split(" ");
            String[] time=s[0].split(":");
            int minute=Integer.parseInt(time[0])*60+Integer.parseInt(time[1]);
            String carnum=s[1];
            boolean input;
            if(s[2].equals("IN")){
                input=true;
            }else{
                input=false;
            }
            list.add(new Parking(minute, carnum, input));
            set.add(s[1]);
        }
        Iterator<String> iter = set.iterator();
        Map<String, Integer> map = new TreeMap<>();
        Map<String, Boolean> visited = new TreeMap<>();
        while(iter.hasNext()){
            String temp=iter.next();
            map.put(temp,0);
            visited.put(temp, false);
        }
        int[] answer = new int[set.size()];
        for(int i=0;i<list.size();i++){
            if(!list.get(i).input){
                visited.put(list.get(i).carnum,false);
                for(int j=i-1;j>=0;j--){
                    if(list.get(i).carnum.equals(list.get(j).carnum)){
                        int tempmin=map.get(list.get(i).carnum);
                        int temp=list.get(i).minute-list.get(j).minute;
                        map.put(list.get(i).carnum,temp+tempmin);
                        break;
                    }
                }
            }else{
                visited.put(list.get(i).carnum,true);
            }
        }
        Iterator<Map.Entry<String, Boolean>> iters = visited.entrySet().iterator();
        while(iters.hasNext()){
            Map.Entry<String, Boolean> tempMap = iters.next();
            if(tempMap.getValue()){
                for(int i=records.length-1;i>=0;i--){
                    if(tempMap.getKey().equals(list.get(i).carnum)){
                        int minute=23*60+59-list.get(i).minute;
                        int temp=map.get(list.get(i).carnum);
                        map.put(list.get(i).carnum,temp+minute);
                        break;
                    }
                }
            }
        }
        Iterator<Integer> ite = map.values().iterator();
        
        for(int i=0;i<answer.length;i++){
            int minute = ite.next();
            if(minute<=fees[0]){
                answer[i]=fees[1];
            }else{
                answer[i]+=fees[1];
                minute-=fees[0];
                if(minute%fees[2]!=0){
                    int temp1=minute/fees[2];
                    answer[i]+=fees[3]*(temp1+1);
                }else{
                    int temp1=minute/fees[2];
                    answer[i]+=fees[3]*temp1;
                }
            }
        }
        return answer;
    }
    
    public class Parking{
        int minute;
        String carnum;
        boolean input;
        public Parking(int minute, String carnum, boolean input){
            this.minute=minute;
            this.carnum=carnum;
            this.input=input;
        }
    }
}

 

 

 

궁금하신 부분이나 부족한 점은 댓글로 알려주시면 감사하겠습니다.

반응형

댓글

💲 추천 글