[Programmers] 주차 요금 계산

bin1225·2023년 4월 1일
0

Algorithm

목록 보기
26/43
  • 문제

뭔가 문제에서 요구하는 것 자체는 되게 간단했는데, 사용하는 변수나 문자열 파싱하는 과정때문에 복잡하게 느껴졌다.(내가 깔끔한 풀이방법을 생각 못한 것도 있을듯)

사용한 아이디어

  1. 시간을 분으로 환산하여 들어온 시간을 기록
  2. 나간 경우에는 들어온 시간을 -1로 하여 나갔다는 것을 기록하고 누적 시간을 checkFee 컨테이너에 추가
  3. 누적시간 계산이 끝나면 나가지 않은 차량에 대한 누적시간 계산 후 요금 계산
  4. set을 이용하여 차량 번호를 기록하고 순서대로 요금을 answer에 추가

중간에 실수한 것들

  1. 문제를 제대로 읽지 않아서 누적시간이라는 것을 인지하지 못하고 출차시마다 요금을 계산하였다. -> 문제를 잘 읽자

  2. set 컨테이너가 자동으로 정렬된다는 사실을 몰라서 괜히 sort하다가 오류 메시지를 겪었다.

    for(auto& at: checkFee){
        money = basicFee;
        totalTime = at.second - basicTime;
        if(totalTime > 0){
            money += totalTime/unitTime * fee;
            if(totalTime%unitTime!=0) money+=fee;                   
        }
        at.second = money;
    }

아직 포인터의 개념이 없어서 잘 이해가 안 간다. (이번에 C프로그래밍 강의 열심히 들어야 할듯)
at.second = money; 로 했는데 값이 없데이트가 안돼서 chat gpt를 이용해 문제점을 찾았다. chat gpt는 신이다 일단 아직 나한테는.
auto로 데이터를 읽어올 때에는 읽는 경우에만 사용하고 업데이트 시에는 다시 포인터 개념을 찾아보거나 다른 방식으로 업데이트 해야겠다.

  • 코드

#include <string>
#include <vector>
#include <set>
#include <sstream>
#include <unordered_map>
#include <iostream>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> fees, vector<string> records) {
    set<int> cars;
    vector<int> answer;
    unordered_map<int,int> checkIn;
    unordered_map<int,int> checkFee;
    int basicTime = fees[0], basicFee = fees[1], unitTime = fees[2], fee= fees[3];
    int carNum, hour, minute, money, totalTime;
    string s, inOut, time;
    
    
    for(int i=0; i<records.size(); i++){
        s=records[i];
        stringstream ss(s);
        ss >> time >> carNum >> inOut;
        
        hour = stoi(time.substr(0,2)); minute = stoi(time.substr(3,2));
        if(inOut=="IN"){
            checkIn[carNum] = hour*60 + minute;
            cars.insert(carNum);
        }
        else{
                totalTime = (hour*60 + minute - checkIn[carNum]);
                checkIn[carNum] = -1; //나간 차량 체크
                checkFee[carNum] += totalTime;
        }
    }
    
    for(auto at: checkIn){
        if(at.second !=-1){
            checkFee[at.first] += (23*60+59 - checkIn[at.first]);
        }
    }
    
    for(auto& at: checkFee){
        money = basicFee;
        totalTime = at.second - basicTime;
        if(totalTime > 0){
            money += totalTime/unitTime * fee;
            if(totalTime%unitTime!=0) money+=fee;                   
        }
        at.second = money;
    }
    
    for(auto at: cars){
        answer.push_back(checkFee[at]);
    }
    return answer;
}

1점밖에 안 주는 더러운 문제

0개의 댓글