[프로그래머스] 2022 KAKAO BLIND 주차 요금 계산 C++

거북이·2022년 3월 23일
0

문제풀이

목록 보기
6/11

문제 링크


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

문제 풀이


주차요금과, 차량의 입차 및 출차에 대한 정보가 배열로 입력으로 주어 질 때 각 차량의 요금을 계산해서 출력해주면 되는 문제이다.

차량의 입/출차 정보는 시간-차량번호-IN/OUT의 형태로 주어지고, 문자열 파싱을 통해 입차와 출차에 대한 정보에 포커스를 맞춰 문제에 접근하였다. 입/출차에 대한 배열이 시간에 순서에 따라 정렬되어 있고, 차량이 나간 정보가 들어온 정보보다 앞에 있는 경우는 없기 때문에 순차탐색을 해주면서 입차에 대한 정보일 경우 새로운 배열을 선언하여 입차에 대한 정보를 저장하고 이를 출차 시에 확인하여 총 주차 시간을 계산해주면 된다. 여기서 차량이 두 번 주차할 경우가 발생할 수 있기 때문에 주차 시간을 누적 시키기 위한 배열이 또 하나 필요하다. 탐색이 종료되고 출차에 대한 정보가 없으면 23:59 분을 출차 시간으로 간주하여 계산해주면 된다. 각 배열들은 차량에 대한 시간을 저장하는 배열이기 때문에 MAP을 이용하여 다음과 같이 풀었다.

  • 문자열 파싱을 해준다. 시간 - 차량 번호 - 입차 및 출차 정보
  • IN이 들어오면 차량번호와, 시간을 MAP in 에 저장
  • OUT이 들어오면 in에서 차량번호를 확인하고 시간을 계산
  • 계산된 시간과 차량번호를 MAP parkingTime에 저장
  • 탐색 종료 후 in에 값이 남아있다면, 23:59 출차했다고 가정하여 계산 후 parkingTime에 저장
  • parkingTime의 크기만큼 반복하여 각 차량번호의 누적시간에 대한 주차요금을 계산 후 answer 벡터에 저장

정답 코드



#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<algorithm>

using namespace std;

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    
    map<string, string> in; // 차량번호 - 입출차시간
    map<string, int> parkingTime; // 차량번호 - 누적시간

    for (string str : records) {
        //문자열 파싱
        int blank = str.find(' ');
        string time = str.substr(0, blank);
        string carNum = str.substr(blank+1);
        int blank2 = carNum.find(' ');
        string inOut = carNum.substr(blank2 + 1);
        carNum = carNum.substr(0, blank2);
        
        
        if (inOut == "IN") {
           in.insert({ carNum, time });
        }
        else if (inOut == "OUT") {
            map<string, string>::iterator iter;
            iter = in.find(carNum);
            string inTime = iter->second;  // 입차 시간
            in.erase(iter);
            int h = stoi(time.substr(0, 2));
            int minute = stoi(time.substr(3, 2));

            h = h - stoi(inTime.substr(0, 2));
            minute = minute - stoi(inTime.substr(3, 2));
            if (minute < 0) {
                minute = 60 + minute;
                h = h - 1;
            }
            minute = h * 60 + minute; //분으로 통일
            if (parkingTime.find(carNum) == parkingTime.end()) {
                parkingTime.insert({ carNum , minute });
            }
            else {
                parkingTime[carNum] += minute;
            }
            
        }
    }

    //입차한 기록은 있으나 출차한 기록이 없는 경우
   while (!in.empty()) {
        map<string, string>::iterator iter;
        iter = in.begin();
        int h = 23;
        int minute = 59;
        h = h - stoi(iter->second.substr(0, 2));
        minute = minute - stoi(iter->second.substr(3, 2));
        minute = h * 60 + minute; //분으로 통일
        if (parkingTime.find(iter->first) == parkingTime.end()) {
            parkingTime.insert({ iter->first , minute });
        }
        else {
            parkingTime[iter->first] += minute;
        }
        in.erase(iter);
    }
    
    //요금계산
   for (auto it = parkingTime.begin(); it != parkingTime.end(); it++) {
        int sum = 0;

        int t = it->second;
        if (t <= fees[0]) {
            sum = fees[1];
        }
        else {
            sum = fees[1];
            while (t - fees[0] >= fees[2]) {
                sum += fees[3];
                t = t - fees[2];
            }
            sum += fees[3];
        }
        answer.push_back(sum);
    }
    return answer;
}

0개의 댓글

관련 채용 정보