티스토리 뷰

반응형

 문제

 

 

 문제 상황

 

- 트래픽을 계산하는데에 조건에 맞춰 최대로 겹치는 개수는 구한다.

 

 

 

 해결 전략

 

- 우선 주어진 시간을 계산하기 쉽게 전부 초(sec)로 변환해준다. 그리고 float의 경우 계산에 오류 발생 가능성이 크기 때문에 소수점 세자리가 제한인 것을 고려해 1000을 곱하여 정수로 처리해준다.

 

 

 

 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 날짜를 넣으면 시작시간과 종료 시간을 반환하는 함수
# 날짜는 고정되어 있으므로 시간, 분, 초만 생각하면 된다.
def time_log(line):
    # 2016년 9월 15일은 고정, 종료 시간, 프로세스 시간
    yymmdd, hhmmss, process = line.split()
    hh,mm,ss = hhmmss.split(':')
    hh,mm,ss = int(hh), int(mm), float(ss)
    # 소수점 연산의 경우 이진분수 표현 문제로 오류가 발생하므로 1000을 곱해 소수점 처리를 해준다.
    process= int(float(process[:-1])*1000)
    end_time = int((hh*3600 + mm*60 + ss)*1000)
    start_time = end_time - process + 1
    return start_time, end_time
    
def solution(lines):
    for idx in range(len(lines)):
        lines[idx] = time_log(lines[idx])
    # lines를 시작 시점을 기준으로 정렬
    lines.sort()
    max_cnt = 0
    for i in range(len(lines)):
        cnt = 0
        # 새로 시작하는 요소 앞의 1초를 탐색한다.
        target_time = lines[i][0]-1000
        for j in range(i+1):
            if lines[j][1> target_time:
                cnt += 1
        if cnt > max_cnt:
            max_cnt = cnt
    return max_cnt
cs

 

 

 

 해설

 

- 시작시간으로 lines를 정렬하여 시작시간을 기준으로만 검색하였다. 시작하는 시점의 이전 1초동안(1000을 곱하였으므로 위 코드에서는 1000) 겹치는 요소의 개수가 1초동안 동시에 진행될 수 있는 프로세스의 개수이므로 검색하여 최대값을 구하였다.

 

 

 

 새로 학습한 것 & 실수 

 

- 0.1의 경우 10진법으로는 1/10으로 떨어져 유한 소수로 구분 가능하지만 2진법으로 표현하면 무한 소수가 된다. 그래서 파이썬에서 소수를 처리할 경우 눈에 보이는 10진수로는 유한소수이지만 내부적으로 무한소수가 되어 오차가 발생할 수 있다. 그래서 float 처리를 위해 rounddecimalimport하여 사용할 수 있지만 이 역시 오류 발생 가능성이 있다. 그래서 floatint로 만들어주기 위해 1000을 곱하였다.

 

 

 

 

출처 - programmers.co.kr/learn/courses/30/lessons/17676
반응형
댓글