카테고리 없음

코테 연습[자바 코테 준비 7일차]

sung.hyun.1204 2023. 7. 1. 14:29

오늘 풀 문제 

 

1. 카카오 2022 기출   주차장 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

예상 시간 20분  /  실제 풀이 : IDE + Math 사용  , 자료 구조 검색 , 1h 30 m

 

간단한 구현 이지만, 피지컬을 요한다.

로직이 어렵거나 복잡한거는 없다 . 자료구조 문제이다 .

 

연습이 필요하다라고 느낀점이 , 디버깅을 돌리면서 확인 하는 사항들이 많았는데 시간이

부족한 프로그래머스 환경에서는 불가능 할 것 같다.

 

놓친 것은 

1. 반올림 여부

2.코드가 길어지니 나오는 실수 ( 변수명의 구분 불가) 등이 있다.

 

배운거 

 

시간이 "01:11" 로 주어지면 , 빠르게 ":" 기준 split 후 , Integer.parseInt 를 과감하게 하자.

숫자로 잘 바꿔준다.

 

TreeMap : 키값을 오름 차순으로 정렬 해서 가진다. 

ex ] 0000 -> 0148 -> ,,

 

"0000" -> parseInteger : 0 

 

 

 

----------------------------------------------------------------------------------------------------------------------

 

 

1번 주차장 문제 

 

@Test
void sol0() {

    String feesGiven = "[180, 5000, 10, 600]";
    String recordsGiven =
        "[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]";

    int[] fees = pr.parseIntegerList(feesGiven);

    recordsGiven = recordsGiven.replace("[", " ").replace("]", ",");
    String[] recordsSplit = recordsGiven.split(",");

    String answerGiven = "[14600, 34400, 5000]";

    int[] ans = pr.parseIntegerList(answerGiven);
    for(int i = 0 ; i< recordsSplit.length;i++) {
        recordsSplit[i] = recordsSplit[i].trim();
    }
    assertThat(ans).containsExactly(solution0(fees, recordsSplit));
}

public int[] solution0(int[] fees, String[] records) {
    System.out.println(Arrays.toString(records));
    // [ 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]

    // carNumber : time ,state , stackTime
    TreeMap<Integer,List<String>> carRecord = new TreeMap<>();
    for(String record : records) {
        String[] info = record.split(" ");
        Integer carNum = Integer.parseInt(info[1]);
        if(!carRecord.containsKey(carNum)) {
            List<String> infoPut = new ArrayList<>();
            infoPut.add(info[0]);
            infoPut.add(info[2]);
            infoPut.add("0");
            carRecord.put(carNum,infoPut);
        }else{
            // info : 05:34 5961 IN
            List<String> recorded = carRecord.get(carNum);
            String time = recorded.get(0);
            String state = recorded.get(1);
            int stackTime = Integer.parseInt(recorded.get(2));
            if(state.equals("IN")) {

                String gt = info[0];
                String[] gtl = gt.split(":");
                int h = Integer.parseInt(gtl[0]);
                int m = Integer.parseInt(gtl[1]);
                int givenTime = h*60 + m;

                String[] tl = time.split(":");
                h = Integer.parseInt(tl[0]);
                m = Integer.parseInt(tl[1]);
                stackTime +=  givenTime - (h*60 + m);

                List<String> infoPut = new ArrayList<>();
                infoPut.add(info[0]);
                infoPut.add(info[2]);
                infoPut.add(Integer.toString(stackTime));
                carRecord.put(carNum,infoPut);
            }else{
                List<String> infoPut = new ArrayList<>();
                infoPut.add(info[0]);
                infoPut.add(info[2]);
                infoPut.add(Integer.toString(stackTime));
                carRecord.put(carNum,infoPut);
            }
        }
    }
    String time = "23:59";
    String[] tl = time.split(":");
    int h = Integer.parseInt(tl[0]);
    int m = Integer.parseInt(tl[1]);
    int maxTime = (h*60 + m);

    //        TreeMap<Integer,List<String>> carRecord = new TreeMap<>();
    // info  : time , state , valuetime
    // crRecord : keu :info
    for (Integer key : carRecord.keySet()) {
        List<String> info = carRecord.get(key);
        if(info.get(1).equals("IN")){
            List<String> infoPut = new ArrayList<>();
            infoPut.add(info.get(0));
            infoPut.add("OUT");
            int stored = Integer.parseInt(info.get(2));

            String[] gt = info.get(0).split(":");
            int hl = Integer.parseInt(gt[0]);
            int ml = Integer.parseInt(gt[1]);
            int tt = (hl*60 + ml);
            stored += (maxTime - tt);
            infoPut.add(Integer.toString(stored));
            carRecord.put(key,infoPut);
        }
    }

    // carRecord :         // carNumber : time ,state , stackTime
    int[] answer = new int[carRecord.size()];
    int index = 0;
    //fees : [180, 5000, 10, 600] : 기본 분 , 기본 요금 , 단위 분 , 단위 금

    int baseT = fees[0];
    int baseM = fees[1];
    int unitT = fees[2];
    int unitM = fees[3];

    for(List<String> info :carRecord.values()){
        if(Integer.parseInt(info.get(2)) <= baseT) {
            answer[index] = baseM;
        }
        else {
            int tmpT = (Integer.parseInt(info.get(2)) - baseT);
            int t = (int) Math.ceil((double) tmpT / unitT);
            answer[index] = baseM + ((t) * unitM);
        }
        index++;
    }
    return answer;
}