관리 메뉴

풀이 보관함

[C++] 프로그래머스: 주차 요금 계산 본문

problem solving/프로그래머스

[C++] 프로그래머스: 주차 요금 계산

viin 2022. 9. 22. 20:08

🔗 문제

코딩테스트 연습 - 주차 요금 계산

 

프로그래머스

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

programmers.co.kr

#2022 KAKAO BLIND RECRUITMENT

 

🖍 풀이

 

간단하게 나누면 세 과정이다.

  1. records[i]를 차번호, 시, 분, 상태로 파싱
  2. 시간 값을 2개씩 꺼내 총 주차 시간을 구한다.
  3. 소수는 올림으로 처리해서 요금을 매긴다.

 

하지만 간단하지 않다.

나는 이 문제를 푸는데 자그마치 2시간이나 걸렸다..

  1. 소수점 처리에서 막혔다.
  2. 출차가 없는 경우의 처리에서 막혔다.

 

 

1) records[i]를 차번호, 시, 분, 상태로 파싱

문제에 차 번호가 4자리로 제한되어 최대 자동차 번호는 9999인 것을 알 수 있다.

또한, 시간 순으로 정보가 주어지기 때문에 OUT, IN을 정렬할 필요가 없다.

그래서 무식하지만 std::queue로 info[9999]로 선언했다.

for(int i=0; i<records.size(); ++i)
{
    int h = std::stoi(records[i].substr(0, 2));
    int m = std::stoi(records[i].substr(3, 2));
    int car = std::stoi(records[i].substr(6, 4));
    std::string state = records[i].substr(11, records[i].length()-11);

    // 분 단위로 변환도 여기서 해주었다. 
    int min = (h*60) + m;
	  info[car].push(min);
}

 

2) 시간 값을 2개씩 꺼내 총 주차 시간을 구한다.

for(int i=0; i<9999; ++i)
{
    min[i] = 0;
    while(!info[i].empty())
    {
        int in = info[i].front(); info[i].pop();
        int out = (23*60) + 59;

        if(!info[i].empty())
        {
            out = info[i].front(); info[i].pop();
        }
        
        min[i]+= (out-in);
    }
}

 

 

3) 소수는 올림으로 처리해서 요금을 매긴다.

//기본 주차 시간 내이면 기본료만 내면 된다. 
if(fees[0] >= min[i])
    answer.push_back(fees[1]);
else
{
    // 여기서 소수 처리 중요.
    int ceil = (min[i]-fees[0])/fees[2];
    
    //소수점이 남아있다면 1더해준다.
    if(min[i]-fees[0]%fees[2] !=0)
        ceil +=1;
    answer.push_back(fees[1] + ceil*fees[3]);
}

 

 

💾  소스

#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>

using namespace std;

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    
    std::queue<int> info[9999];
    int min[9999] = {-1, };
    
    for(int i=0; i<records.size(); ++i)
    {
        //parsing
        int h = std::stoi(records[i].substr(0, 2));
        int m = std::stoi(records[i].substr(3, 2));
        int car = std::stoi(records[i].substr(6, 4));
        std::string state = records[i].substr(11, records[i].length()-11);
    
        int min = (h*60) + m;
        info[car].push(min);
    }
    
    for(int i=0; i<9999; ++i)
    {
        min[i] = 0;
        while(!info[i].empty())
        {
            int in = info[i].front(); info[i].pop();
            int out = (23*60) + 59;
            if(!info[i].empty())
            {
                out = info[i].front(); info[i].pop();
            }
            
            min[i]+= (out-in);
        }
    }

    for(int i=0; i<9999; ++i)
    {
        if(min[i]!=0)
        {
            if(fees[0] >= min[i])
                answer.push_back(fees[1]);
            else
            {
            
                int tmp = std::ceil((min[i]-fees[0])/fees[2]);
                if((min[i]-fees[0])%fees[2] != 0)
                    tmp+=1;
                
                answer.push_back(fees[1] + (tmp*fees[3]));
            }
        }
    }
    
    
    return answer;
}