HJW's IT Blog

[Programmers] KAKAO BLIND 주차요금 계산 (C++) 본문

Algorithm

[Programmers] KAKAO BLIND 주차요금 계산 (C++)

kiki1875 2024. 3. 28. 11:22

문제

 


제한사항

  • fees 배열의 길이는 4 고정
    • fees[0] = 기본 시간
    • fees[1] = 기본 요금
    • fees[2] = 단위 시간
    • fees[3] = 단위 요금
  • records 배열은 문자열 배열이다
    • 형식은 [시각 차량번호 IN/OUT] 이다
    • 입차기록이 있지만 출차 기록이 없다면 23:59분에 출차한 것으로 간주한다
  • 주차장에 없는 차량이 출차되거나, 이미 있는 차량이 다시 입차되는 경우는 없다
  • 잘못된 시각은 입력으로 주어지지 않는다.

풀이

  • 문제에서 주차장에 없는 차량이 출차되거나 이미 있는 차량이 다시 입차되는 경우는 없다고 하였다.
  • 즉 같은 차량 번호라면 무조건 -> 입차, 출차, 입차, 출차 순으로 
  • map 을 생성하여 한 차량 번호에 대한 시각을 모두 기록해 놓았다
    • 이때, 시간은 00:00 ~ 23:59 까지 이기 때문에 모두 분으로 변경하여 저장하였다.
    • 또한 입차 기록은 있지만 출차 기록이 없을 경우 계산하기 위한 최대 시간 변수도 생성하였다.
    • 차량별로 저장된 시간을 돌며, 입차와 출차 사이의 시간을 계산, 후 다른 map에 저장해 주었다
    • 출차 기록이 없는 차량을 위해 다음 조건문을 걸었다
      • if(차량 시간 백터 % 2 != 0 && j == 차량시간백터.size() - 1) 
        • 마지막 요소이면서 저장된 차량의 시간 수가 홀수일 경우 출차기록이 없는것이므로
        • 그 외의 값에 대해서는, 현제 index j 가 홀수라면 출차, 짝수라면 입차이기 때문에 출차일 때 입차 기록을 확인하여 계산해 주었다
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <cmath>

using namespace std;

vector<int> solution(vector<int> fees, vector<string> records) {


    vector<int> answer;

    map<string, vector<int>> m;

    map<string, int> m2;

    int max = 23 * 60 + 59;



    string current;

    for(int i = 0; i<records.size(); i++){
        string temp = records[i].substr(6,4);
        int temp_hour = stoi(records[i].substr(0,2));
        int temp_min = stoi(records[i].substr(3,2));
        int time = (temp_hour * 60) + temp_min;
        m[temp].push_back(time);
    }

    for(auto i : m){
        for(int j = i.second.size() - 1 ; j >= 1; j--){
            if(i.second.size() % 2 != 0 && j == i.second.size() - 1){
                m2[i.first] += (max - i.second[j]);
            }else if(j%2 == 1){
                m2[i.first] += (i.second[j] - i.second[j-1]);
            }else if(j%2 == 0){
                continue;
            }
        }
        if(i.second.size() == 1){
            m2[i.first] += (max - i.second[0]);
        }
    }

    for(auto i : m2){

        double calc = 0;

        if(i.second > fees[0]){
            calc = fees[1] + ceil(static_cast<double>(((i.second - fees[0])) / static_cast<double>(fees[2]))) * fees[3];

        }else{
            calc = fees[1];
        }


        answer.push_back(calc);

    }

    return answer;

 

* 처음에 풀때, 중간 차량번호를 기준으로 정렬을 하고 시작했더니 오답이 나왔다,,, 이유는 아직 모르겠다

* 그러다 검색하던중, map은 기본적으로 오름차순 정렬이라하여 정렬 코드를 제거했더니 통과