본문 바로가기
알고리즘/c++ 프로그래머스

[프로그래머스 주차 요금 계산] c++ (풀이, 코드)

by 말린밴댕이_공부 2023. 5. 21.
반응형

문제 링크

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

 

프로그래머스

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

programmers.co.kr

문제

코드 및 풀이

아직 프로그래머스를 많은 문제를 풀지는 않았습니다. 40~50문제 푼 문제중에서 가장 어려웠다고 생각합니다.

 

어려웠던 기준은 입출차를 여러번 한다는 점도 생각을 해야한다는 점에 대해서 생각을 하느라 골머리를 썩지 않았나 생각합니다.

 

풀이법

우선 시간을 환산시켜줄 calc_time(분으로) 함수와 가격을 올림해서 계산해주는 calc_cost함수를 만들었습니다.

 

원래같으면 규칙에 대해서 정규식 혹은 똑같이 문자열이 들어오기 때문에 그것을 기준으로 짜르려 했지만 sstream함수를 이제는 써야할때가 온것 같아 공백 혹은 ','를 기준으로 짤라 나온 토큰에 대해 vector<string>s 에 push_back 하였습니다.

 

map을 굳이 두개 써야하나 싶긴 하지만 입출차를 위해서는 어쩔수 없이 두개를 쓰는게 맞지 않나 싶습니다.

 

마지막으로 차번호를 기준으로 오름차순으로 가격을 출력하지만 map은 key값을 기준으로 애초에 정렬이 되기 때문에 출력을 진행하였습니다 !

 

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

using namespace std;

int calc_time(string hour, string minute);
int calc_cost(vector<int> fees,int time);

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    map<int,int> m; //차 번호, 입출 시간
    map<int,int> pair_io; //차 번호, 총 시간(분)
    int time = 0;
    int car = 0;
    int cost = 0;
    vector<string> s; //하나의 입출차 내역에 4가지를 push_back을 할 예정
    string token; // 자를때마다 받은 토큰들
   
   
   
    for(int i = 0 ; i < records.size();i++){
        s.clear();
        char delimeter = ':';
        istringstream iss(records[i]);
        while(getline(iss,token,delimeter)){
            //처음 ':'로 구분후 ' '이므로 이렇게 진행
            s.push_back(token);
            delimeter = ' ';
        }
        time = calc_time(s[0],s[1]);
        car = stoi(s[2]);
        if(s[3] == "IN"){
            m.insert(make_pair(car,time));
        }else{
            m[car] = time - m[car];
            if(pair_io.find(car) == pair_io.end()){
                pair_io.insert(make_pair(car,m[car]));
            }else{
                pair_io[car] = pair_io[car] + m[car];
            }
            m.erase(car);
        }
    }
   
    //이제 출차하지 않은 차들 "23:59"로 일괄적으로 처리
    for(auto it = m.begin(); it != m.end();it++){
        time = calc_time("23","59");
        time -= it -> second;
        if(pair_io.find(it->first) != pair_io.end()){
            time += pair_io[it->first];
        }
        pair_io[it->first] = time;
    }
   
    for(auto it = pair_io.begin();it!=pair_io.end();it++){
        cost = calc_cost(fees,it->second);
        answer.push_back(cost);
    }
    return answer;
}

int calc_time(string hour, string minute){
    int sum = stoi(hour) * 60 + stoi(minute);
    return sum;
}

int calc_cost(vector<int> fees,int time){
    if(time <= fees[0]) //기본 요금일때
        return fees[1];
    //기본요금 아닐때 계산 , 기본요금 + 단위요금 return
    int unitFee = 0;
    time -= fees[0];
    unitFee = ((time/fees[2]) + (time % fees[2] > 0 ? 1 : 0)) * fees[3]; //올림을 해줘야함
    cout <<unitFee<<"    ";
    return fees[1] + unitFee;
}
반응형

댓글