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

YH J·2023년 10월 4일
0

프로그래머스

목록 보기
161/168

문제 링크

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

내 풀이

stringstream으로 먼저 파싱하는데 : 를 제거하고 시, 분, 차번호, IN or OUT
이렇게 4개로 나누어서 파싱하였다. IN을 만나면 rec에 등록하고 OUT을 만나면 rec의 기록과 비교해서 시간을 구해서 Fees에 더해준다.
OUT을 못만난 값은 23:59를 적용시켜 다시한번 더해준다.
키값이 차번호이므로 정렬되어있으므로 차례대로 요금을 계산해서 answer에 넣어준다.

내 코드

#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;

int Fee(int a, int b, int c, int d, int num)
{
    int fee = b;
    num -= a;
    if(num <= 0)
        return fee;   
    fee += d * (num % c ? num/c + 1 : num/c);
    return fee;
}
vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    
    for(int i = 0; i < records.size(); i++)
    {
        for(int j = 0; j < records[i].length(); j++)
            if(records[i][j] == ':')
            {
                records[i][j] = ' ';
                break;
            }
    }
    // IN일때 rec에 등록, OUT일 때 rec에 등록된 시간 비교해서 Fees에 등록
    map<int, int> rec;
    map<int, int> Fees;
    // 파싱하면서 IN이면 rec에 등록, OUT이면 시간 계산해서 Fees에 등록
    for(string s : records)
    {
        int hour;
        int min;
        int carnum;
        string inout;
        stringstream ss;
        ss.str(s);

        ss >> hour >> min >> carnum >> inout;
        
        if(inout == "IN")
            rec[carnum] = hour * 60 + min;
        else if(inout == "OUT")
        {
            int f = hour * 60 + min;
            f -= rec[carnum];
            Fees[carnum] += f;
            rec.erase(carnum);
        }
    }
    // OUT이 없는 애들 23:59에 출차로 기록하기
    for(auto r : rec)
    {
        int f = 23 * 60 + 59;
        f -= r.second;
        Fees[r.first] += f;
    }
    // 이제 검출해낸 시간으로 계산하기
    for(auto f : Fees)
        answer.push_back(Fee(fees[0],fees[1],fees[2],fees[3],f.second));
    
    return answer;
}

다른 사람의 풀이

#include <bits/stdc++.h>
using namespace std;

int conv(string& t) {
    int h = (t[0] - 48) * 10 + t[1] - 48;
    int m = (t[3] - 48) * 10 + t[4] - 48;
    return h * 60 + m;
}

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> vec[10000];
    for (auto& record : records) 
    {
        stringstream ss(record);
        string a, b, c;
        ss >> a >> b >> c;
        vec[stoi(b)].push_back(conv(a));
    }

    vector<int> ans;
    for (int i = 0; i < 10000; ++i) if (!vec[i].empty()) 
    {
        if (vec[i].size() & 1) vec[i].push_back(23 * 60 + 59);

        int sum = 0;
        for (int j = 1; j < vec[i].size(); j += 2) sum += vec[i][j] - vec[i][j - 1];

        int val = fees[1];
        if (sum > fees[0]) val += (sum - fees[0] + fees[2] - 1) / fees[2] * fees[3];

        ans.push_back(val);
    }

    return ans;
}

다른 사람의 풀이 해석

파싱을 string으로 하여 시간을 통째로 검출하고 차번호와 IN or OUT 3개로 분해했다.
시간은 OO:OO형태이므로 이것에 맞춰서 계산했다.
int형 벡터를 10000개를 선언해두고 파싱한 시간값을 모두 넣었다.
그 후 사이즈가 홀수인 벡터 ( OUT이 없었던 것 )에 23:59를 넣어준다.
그 후 값을 계산해서 ans에 넣어주었다.

profile
게임 개발자 지망생

0개의 댓글