민팽로그

[프로그래머스/2022 KAKAO BLIND RECRUITMENT] 주차 요금 계산 본문

카테고리 없음

[프로그래머스/2022 KAKAO BLIND RECRUITMENT] 주차 요금 계산

민팽 2022. 4. 27. 18:04

작성 코드 먼저.

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

using namespace std;

// 자동차 차량번호별로 주차시간을 구해야 함
// 차량번호가 중복저장되지 않게 하기 위해 map 자료형을 사용하는게 좋을듯(차량번호 - 중복 불가, string, 입차 또는 출차 시간 - vector<string>)
// second 길이 검사: map 자료형의 second 길이가 홀수라면 끝에 23:59 추가
// map은 key값을 기준으로 오름차순 정렬하기 때문에 이 부분은 고려하지 않아도 됨

// (차량번호가 작은 순서대로)누적 주차 시간을 계산하여 벡터로 리턴
vector<int> calculate_time(map<string, vector<string>>& m) {
    vector<int> time;
    for(auto x: m) {
        if(x.second.size() % 2 == 1) x.second.push_back("23:59");
        
        int min = 0;
        for(size_t i = 0; i < x.second.size(); i += 2) {
            string hour1, hour2, min1, min2;
            hour1 = x.second[i].substr(0, 2);
            min1 = x.second[i].substr(3, 2);
            hour2 = x.second[i + 1].substr(0, 2);
            min2 = x.second[i + 1].substr(3, 2);
            
            int m1, m2, h1, h2;
            m1 = stoi(min1); m2 = stoi(min2); h1 =  stoi(hour1); h2 = stoi(hour2);
            if((m2 - m1) < 0) {
                h2 -= 1;
                m2 += 60;
            }
            min += (((h2 - h1) * 60) + m2 - m1);
        }
        time.push_back(min);
    }
    
    return time;
}

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    map<string, vector<string>> car_record;
    
    for(size_t i = 0; i < records.size(); i++) {
    	// records에서 시간, 차량번호, 입출차 내역 분리
        string time, car_num;
        istringstream ss(records[i]);
        getline(ss, time, ' ');
        getline(ss, car_num, ' ');

	// map 자료구조에 차량번호에 따른 입출차 시간 저장
        if(car_record.find(car_num) == car_record.end()) 
        	car_record.insert({car_num, vector<string>(0)});
        car_record[car_num].push_back(time);
    }

    vector<int> time;
    time = calculate_time(car_record);
    // 요금 계산
    for(auto x: time) {
        if(x <= fees[0]) 
            answer.push_back(fees[1]);
        else
            answer.push_back((ceil((x - fees[0]) / (float)fees[2]) * fees[3]) + fees[1]);
    }
    
    return answer;
}

 

문자열을 다루는 것에 익숙하지 않아서 문제 푸는 속도가 더 느린것 같다.

이번엔 substr 함수이다.

string 타입의 문자열에서 일부분을 얻어올 수 있는 함수이다. 인자로 시작 위치와 얻어올 문자열의 길이를 받는다. 알아두면 잘 사용할 수 있을 것 같으니 잊지 않도록 하자!

+ records에서 준 입출력(IN / OUT) 정보는 사용하지 않았다. 코드가 괜히 지저분해진 것 같은 생각이 든다. 다른 사람들의 코드를 좀 더 살펴봐야 겠다.

Comments