프로그래머스 - 주차 요금 계산
2022. 9. 13. 17:31ㆍ코딩 공부 연습
반응형
카카오 블라인드 문제였던 주차 요금 계산이다. 열심히 풀었는데 문제를 잘못이해해서 처음부터 다시 해야한다.
그런데 c++에서의 문자열 처리 부분에서 기억해 놓으면 참 좋을 것 같은 게 많아서 갈아엎기전에 좀 기억할 겸 정리해 놓고 가려고 한다ㅋㅋ
우선, strtok 이다. 이 strtok 는 char * 형에 대해서만 사용할 수 있기 때문에 이 문제처럼 vector<string> records 로 들어오면 이 string 타입을 같은 크기만큼의 캐릭터배열로 만들고, 옮겨준 다음에 strtok를 하고, 잘라낸 char * 배열은 다시 string 으로 바꿔서 vector <string>에 저장해 주어야 한다. python으로 코테를 보지 않는 한계다! 허허
char tmp[records[i].length()]; //string reconds의 크기만큼 캐릭터 배열 할당
strcpy(tmp, records[i].c_str()); //c_str로 스트링을 캐릭터배열로 바꿔야 strtok사용 가능
char *ptr = strtok(tmp, " "); //strtok를 사용해 띄어쓰기 기준으로 tmp를 자르기 시작
vector<string> token;
while(ptr != NULL)
{
token.push_back(string(ptr));
ptr = strtok(NULL, " ");
}
틀리게 짠 전체코드는 다음과 같다ㅋㅋ 이거 그 입,출차를 여러번 하면 그 시간 합으로 구해야하는걸 몰랐다. 난 상식적으로 들어갔다 나올때마다 요금을 부과했는데, 그냥 다 더해서 마지막에 계산만 해주면 되는거였다 하하! 쉬운거였는디
#include <string>
#include <vector>
#include <iostream>
#include <cstring>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
int change_to_time(string str)
{
int si, boon;
si = 0;
if (str[0] == '1')
si = 10;
else if (str[0] == '2')
si = 20;
si += (str[1] - '0');
boon = 0;
boon += 10*(str[3] -'0');
boon += (str[4] - '0');
return (si*60 + boon);
}
int get_fee(int starttime, int endtime, vector<int>fees)
{
int total = 0;
int diff = endtime-starttime;
if (fees[0] >= diff)
return fees[1];
//total+=fees[0];
diff-=fees[0]; //기본요금빼고,
int dividend = diff/fees[2];
total += fees[1];
total += (dividend*fees[3]);
return total;
}
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
vector<pair<int,int>> tmp_ans;
map<string, string> cars;
for(int i = 0; i< records.size(); i++)
{
//레코드를 다 잘라서, in 인 경우에는 pair 벡터 리스트에 일단 집어넣음.(차량번호- 시간)
//out일 때 벡터에서 차량번호를 찾아서 나간시간과 대조, 없애버림...
//마지막에 남아있는거 제외 -> 벡터말고 set으로 하는게 나을듯.
char tmp[records[i].length()]; //length, size 차이가 있나? 난 사이즈 쓰는디
strcpy(tmp, records[i].c_str()); //c_str로 스트링을 캐릭터배열로 바꿔야 strtok사용 가능
char *ptr = strtok(tmp, " ");
vector<string> token;
while(ptr != NULL)
{
token.push_back(string(ptr));
ptr = strtok(NULL, " ");
}
if(token[2] == "IN")
cars.insert({token[1], token[0]});
if (token[2] == "OUT")
{
string intime = cars.find(token[1])->second;
cars.erase(cars.find(token[1]));
// 이제 스트링으로 들어온 05:34 를 시간으로 바꿔서 in, out 사이 시간을 계산해야함.
int starttime = change_to_time(intime);
int endtime = change_to_time(token[0]);
// cout<<starttime << ' ' << endtime << '\n';
// 이제 요금을 계산할 수 있고, 차량번호가 작은 수부터 벡터에 담에 리턴해줘야 하기 때문에 차량번호-요금 벡터를 만들어 다 저장한다.
//cout<< "starttime and endtime : " << starttime << ' ' << endtime << '\n';
int total = get_fee(starttime, endtime, fees);
//cout<< "total is " << total<<'\n';
char tmpnum[token[1].length()]; strcpy(tmpnum, token[1].c_str());
int carnum = atoi(tmpnum);
tmp_ans.push_back({carnum, total});
}
}
// cout<<cars.size()<<'\n';
if (cars.size() != 0)
{
int sz = cars.size();
for (int i = 0 ; i < sz; i++)
{
string intime = cars.begin()->second;
cout<< "left cars intime is " << intime << '\n';
int starttime = change_to_time(intime);
int endtime = change_to_time("23:59");
cout<< "endtime - starttime is " <<starttime << ' ' << endtime << ' ' << endtime - starttime <<'\n';
int total = get_fee(starttime, endtime, fees);
char tmpnum[cars.begin()->first.size()];
strcpy(tmpnum, cars.begin()->first.c_str());
int carnum = atoi(tmpnum);
tmp_ans.push_back({carnum, total});
cars.erase(cars.begin());
}
}
sort(tmp_ans.begin(), tmp_ans.end());
for(int i = 0; i< tmp_ans.size(); i++)
{
cout<<tmp_ans[i].first << ' '<< tmp_ans[i].second << '\n';
}
// 24시를 넘어간 차량이 있기 때문에 걔네들도 위에 for문에서 한 일을 해줌.
return answer;
}
나중에 고치면 새로 올려야지 아
'코딩 공부 연습' 카테고리의 다른 글
프로그래머스 - 최댓값과 최솟값 (0) | 2022.09.15 |
---|---|
프로그래머스 - 영어 끝말잇기 (1) | 2022.09.13 |
프로그래머스 - k진수에서 소수 개수 구하기! (0) | 2022.09.08 |
백준 바킹독 재귀 모음 - 1629 곱셈, (0) | 2022.09.07 |
소프티어 - H-클린알파 (0) | 2022.09.05 |