본문 바로가기
전공공부/코딩테스트

(c++) 프로그래머스 추석 트래픽

by 시아나 2022. 1. 6.

https://programmers.co.kr/learn/courses/30/lessons/17676

 

코딩테스트 연습 - [1차] 추석 트래픽

입력: [ "2016-09-15 20:59:57.421 0.351s", "2016-09-15 20:59:58.233 1.181s", "2016-09-15 20:59:58.299 0.8s", "2016-09-15 20:59:58.688 1.041s", "2016-09-15 20:59:59.591 1.412s", "2016-09-15 21:00:00.464 1.466s", "2016-09-15 21:00:00.741 1.581s", "2016-09-1

programmers.co.kr


나의 풀이

 

#include <string>
#include <vector>
#include <sstream>
#include <iostream>

using namespace std;
int times[3000][2] = { 0 };
int biggest = 1;

void checkTimes(int size) {
    for(int i = 0 ;i<size;i++){
        int count = 0;
        for (int k = 0; k < size; k++) {
            int start = times[k][0];
            int end = times[k][1];
            if ((times[i][1] <= start && start<= times[i][1] + 999)|| 
            times[i][1] <= end && end <=times[i][1] + 999 || 
            start <= times[i][1] && end >= times[i][1]+999) {
                count++;
            }
        }
        biggest = biggest < count ? count : biggest;
    }
}

int solution(vector<string> lines) {
    for (int i = 0; i < lines.size(); i++) {
        string tmp;
        int time[4] = { 0 };
        istringstream ss(lines[i]);
        getline(ss, tmp, ' ');
        for (int k = 0; getline(ss, tmp, ':'); k++) {
            time[k] = stof(tmp) * 10000 / 10;
        }
        tmp = tmp.substr(7);
        tmp.erase(tmp.size() - 1, 1);
        time[3] = stof(tmp)*1000;
        times[i][1] = time[0] * 3600 + time[1] * 60 + time[2];
        times[i][0] = (times[i][1] - time[3]) + 1;
    }
    checkTimes(lines.size());

    return biggest;
}

float에서 다른 자료형으로 변환할때 소수점 아래의 숫자가 사라지는 문제가 있었다.

이에 1000을 곱하여 정수형으로 변환하려고 했으나 완벽하지 않은 숫자때문에 조금 애를 먹었다.

예를 들어 2x1000이 2000이 되는 것이 아니라 1999가 되는 경우가 있어서 x10000을 해주고 10을 나누어 해결하였다.

 

 

다른 사람의 풀이를 보니 sscanf를 사용해서 간단히 푸는 방법이 있었다.

다음에는 sscanf를 활용해봐야지