2022 KAKAO BLIND RECRUITMENT-주차 요금 계산-C++

고동현·2024년 5월 7일
0

PS

목록 보기
25/51

주차요금계산 바로가기
1번문제와 비슷해서 매우 간단한문제

우리는 map을 만들어야하는데

이거랑,
0202 16:00 18:00
3961 16:00 18:00 23:58
이 map을 만들어야한다
우선 map을 사용해야하는이유는 애초에 answer반환형이 오름차순이기 때문에 애초에 carnumber를 넣을때 map을 사용하면 자동으로 오름차순이된다.

map<string,vector> record;
map<string,int> fee;

1번 파싱해서 record에 넣기

  for(int i=0;i<records.size();i++){
      string tmp = records[i];
      string time = tmp.substr(0,5); //05:34
      string carNumber = tmp.substr(6,4); //5961
      record[carNumber].push_back(time);
  }

2번 파싱한거 시간계산하기

for(auto & pair : record){
        string carNumber = pair.first;
        int total = 0;
        vector<string> & v = pair.second;
        int x = 0;
        int y = 0;
        for(int i=0;i<v.size();i++){
            if(i%2==0){
                x=makeInt(v[i]);
            }else{
                y=makeInt(v[i]);
                total += (y-x);
                x=0;
                y=0;
            }
        }
        
        if(v.size() % 2 !=0){
            y = makeInt("23:59");
            total +=(y-x);
        }
        fee[carNumber] = total;
    }

우선 carNumber를 가져오고 second가 vector니까 vector를 돈다.
핵심은 어차피 짝수는 무조건 입차고 홀수는 무조건 출차이다. 그래서 짝수 번째의 string이 10:00이면 이걸 가지고 int 숫자로 바꾸고 홀수 번째의 string이 12:00 이면 int로 바꿔서 total에다가 더해주고 초기화한다.

그런데 중요한게 만약 v.size()가 홀수라면 마지막으로 입차하고 안나간놈이있어서 이걸 마지막에 계산해줘야한다.

3번. makeInt

    int makeInt(string time){
    string hour = time.substr(0,2);
    string min = time.substr(3,2);
    return stoi(hour)*60+stoi(min);
}

간단하게 파싱을해주고 hour는 60을 곱하고 min은 그냥 더하면된다.

4번. fee를 돌면서 계산하면된다.

for(auto & pair : fee){
            cout<<pair.first<<": "<<pair.second<<"\n";
            int time = pair.second;
            if(time<=fees[0]){
                answer.push_back(fees[1]);
            }else{
                double a = (double)(time-fees[0])/fees[2];
                int b = (time-fees[0])/fees[2];
                int tmp=0;
                if(a-b>0){tmp=b+1;}else{
                    tmp = b;
                }
                answer.push_back(fees[1]+tmp*fees[3]);
            }
    }

그냥 수식대로 구현을 하면되는데 핵심은 double로 캐스팅 (double)로 하나 받고 하나는 int로 받아서 뺀값이 0보다크면 소수가있다는거니까 0보다크면 +1 해줘서 올려주고 아니면 그냥 그대로 썻다.

정답코드

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

map<string,vector<string>> record;
map<string,int> fee;

int makeInt(string time){
    string hour = time.substr(0,2);
    string min = time.substr(3,2);
    return stoi(hour)*60+stoi(min);
}

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    
    for(int i=0;i<records.size();i++){
        string tmp = records[i];
        string time = tmp.substr(0,5);
        string carNumber = tmp.substr(6,4);
        record[carNumber].push_back(time);
    }
    
    for(auto & pair : record){
        string carNumber = pair.first;
        int total = 0;
        vector<string> & v = pair.second;
        int x = 0;
        int y = 0;
        for(int i=0;i<v.size();i++){
            if(i%2==0){
                x=makeInt(v[i]);
            }else{
                y=makeInt(v[i]);
                total += (y-x);
                x=0;
                y=0;
            }
        }
        
        if(v.size() % 2 !=0){
            y = makeInt("23:59");
            total +=(y-x);
        }
        fee[carNumber] = total;
    }
    
    for(auto & pair : fee){
            cout<<pair.first<<": "<<pair.second<<"\n";
            int time = pair.second;
            if(time<=fees[0]){
                answer.push_back(fees[1]);
            }else{
                double a = (double)(time-fees[0])/fees[2];
                int b = (time-fees[0])/fees[2];
                int tmp=0;
                if(a-b>0){tmp=b+1;}else{
                    tmp = b;
                }
                answer.push_back(fees[1]+tmp*fees[3]);
            }
    }
    return answer;
}
profile
항상 Why?[왜썻는지] What?[이를 통해 무엇을 얻었는지 생각하겠습니다.]

0개의 댓글