풀이
특별한 알고리즘 없이 그리디하게 풀 수 있는 문제였다.
먼저 특정 시간에 버스가 오면 그 때, 탈 수 있는지 없는지를 판단한다.
만약 탈 수 있다면 버스가 도착하는 시간에 나와서 타면 된다.
문제는 버스 탑승 인원만큼 서 있을 때가 문제다.
만약 버스 탑승 인원 만큼 서 있다면, 마지막에 버스에 탑승하는 사람보다 1분 빠르게 줄을 서면 된다.
(마지막에 줄을 서 있는 인원이 아니라 마지막에 버스에 탑승하는 인원이다.)
요약하면 탑승시간 변수에 버스가 오는 시간을 저장한다.
만약 그 시간에 탑승하는 인원들이 많아 버스의 탑승인원과 같거나 많아지면 마지막에 탑승하는 인원의 탑승시간보다 1분 빨리나오도록 한다.
버스의 운행 횟수만큼 위 과정을 반복하면, 제일 늦게 버스를 탈 수 있다.
[아이디어 정리]
- 버스가 올 때마다 줄 서 있는 인원 중 버스를 탈 수 있는 사람의 수를 세며 count를 1씩 늘린다.
- 만약 count가 버스의 최대 탑승인원과 같아지면, 다음 인덱스를 st에 저장하고 내 탑승 시간을 마지막 인원의 시간에서 -1분을 뺀 값으로 저장한다.
- 그 뒤에 오는 버스가 있다면, 버스의 도착시간으로 내 탑승시간을 수정하고, 다시 버스를 탈 수 있는 인원을 센다.
- 위 과정을 반복해 최종적으로 나오는 값을 return한다.
Code
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(int n, int t, int m, vector<string> timetable) {
    vector<int> realTable;
    int num=0;
    for (int i=0; i<timetable.size(); i++)
    {
        num=stoi(timetable[i].substr(0,2))*60+stoi(timetable[i].substr(3,2));
        realTable.push_back(num);
    }
    sort(realTable.begin(),realTable.end());
    int st=0;
    int stTime, ridePerson, myTime;
    for (int i=0; i<n; i++) //n번 운행
    {
        ridePerson=0;
        stTime=9*60+i*t;
        myTime=9*60+i*t;
        for(int j=st; j<realTable.size(); j++)
        {            
            if (realTable[j]<=stTime)
            {
                ridePerson+=1;    
            }
            else // 시간이 초과됨
            {
                st=j;
                break;
            }
            if (ridePerson==m) // 버스 인원이 다 참, 다음 인덱스부터 시작해야 함
            {
                st=j+1;
                myTime=realTable[j]-1;
                break;
            }
        }
    }
    string minuite,hour;
    hour=to_string(myTime/60);
    minuite=to_string(myTime%60);
    if (hour.length()<2)
    {
        hour="0"+hour;
    }
    if (minuite.length()<2)
    {
        minuite="0"+minuite;
    }
    string answer=hour + ":" + minuite;   
    return answer;
}
문자를 숫자로 숫자를 문자로 변환하는게 더 힘든 문제였다...
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
반응형
    
    
    
  'Algorithm > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/C++] 자동완성 (0) | 2024.01.07 | 
|---|---|
| [프로그래머스/C++] 거스름돈 (1) | 2024.01.07 | 
| [프로그래머스/C++] 최적의 행렬 곱셈 (1) | 2024.01.07 | 
| [프로그래머스/C++] 퍼즐 조각 채우기 (0) | 2024.01.07 | 
| [프로그래머스/C++] 다단계 칫솔 판매 (0) | 2024.01.07 |