알고리즘/프로그래머스

[프로그래머스] 주차 요금 계산 C++ (Lv.2)

lheunoia 2023. 4. 30. 14:56

 

 

 

 

 

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

 

프로그래머스

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

programmers.co.kr

 

이번 문제는 2022 KAKAO BLIND RECURITMENT 문제였습니다.

 

 

 

 

 

 

📝 문제 풀이

1. 차량의 입차 시간을 담을 getIn 맵 선언 (key: 차랑 번호, value: 입차 시간)

2. 각 차량의 주차 이용 시간을 담을 timeOfUse 맵 선언 (key: 차랑 번호, value: 누적된 주차 이용 시간)

3. records 벡터를 순회하며 주차 이용 시간 계산

  • records의 각 문자열을 stringstream 타입을 사용하여 시각, 차량번호, 내역 ➡️ time, carNumber, info 변수에 할당 (💡 sstream 헤더 파일 추가해야 함) ⭐️
  • info == "IN" 인 경우 getIn[carNumber]에 입차 시간 삽입
  • info == "OUT" 인 경우 getIn[carNumber].back()과 출차 시간으로 주차 이용 시간 계산 ➡️ timeOfUse[carNumber]에 누적

4. getIn 맵을 순회하며 출차 내역이 없는 경우에는 출차 시간을 23:59로 계산하여 timeOfUse[carNumber]에 누적

5. timeOfUse 맵을 순회하며 각 차량의 주차 요금 계산

  • 주차 이용 시간이 기본 시간 이하라면, 기본 요금 청구
  • 주차 이용 시간이 기본 시간을 초과하면, 기본 요금 + 초과한 시간에 대한 단위 시간마다 단위 요금 청구

 

 

 

 

👩🏻‍💻 C++ 코드

#include <string>
#include <vector>
#include <map>
#include <sstream>
#include <cmath>

using namespace std;

int computeTimeOfUse(string ot, string it) {
    int hourDiff = stoi(ot.substr(0, 2)) - stoi(it.substr(0, 2));
    int minuteDiff = stoi(ot.substr(3, 2)) - stoi(it.substr(3, 2));
    
    return abs(hourDiff * 60 + minuteDiff);
}

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    map<string, vector<string>> getIn; // 각 차량의 입차 시간을 담은 객체
    map<string, int> timeOfUse; // 각 차량의 주차 이용 시간을 담은 객체
    
    for (string record: records) {
        stringstream ss(record);
        string time, carNumber, info;
        ss >> time >> carNumber >> info;
        
        // 입차 내역인 경우
        if (info == "IN") getIn[carNumber].push_back(time);
        else {
            string in_time = getIn[carNumber].back();
            getIn[carNumber].pop_back();
            int time_of_use = computeTimeOfUse(time, in_time);
            timeOfUse[carNumber] += time_of_use;
        }
    }
    
    // 출차 내역이 없는 경우, 출차 시간은 23:59
    for (auto it: getIn) {
        if (!getIn[it.first].empty()) timeOfUse[it.first] += computeTimeOfUse("23:59", getIn[it.first].back());
    }
    
    for (auto it: timeOfUse) {
        if (timeOfUse[it.first] <= fees[0]) answer.push_back(fees[1]);
        else answer.push_back(fees[1] + ceil((double)(timeOfUse[it.first] - fees[0]) / fees[2]) * fees[3]);
    }
    
    return answer;
}

 

프로그래머스 - 결과 화면

 

 

 

 

반응형