https://school.programmers.co.kr/learn/courses/30/lessons/72414

 

프로그래머스

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

programmers.co.kr


try1

여러가지 시도를 하였지만 전부 실패해서 다른 사람 코드를 분석

 

※ 다른 사람 코드

def str_to_int(time):                  # str형식을 int로 바꿔줘서 시간을 초 단위로 계산
    h, m, s = time.split(':')
    return int(h) * 3600 + int(m) * 60 + int(s)
    
def int_to_str(time):                  # 초 단위 시간을 원래 str형식으로 바꿔줌
    h = time // 3600
    h = '0' + str(h) if h < 10 else str(h)
    time = time % 3600
    m = time // 60
    m = '0' + str(m) if m < 10 else str(m)
    time = time % 60
    s = '0' + str(time) if time < 10 else str(time)
    return h + ':' + m + ':' + s

def solution(play_time, adv_time, logs):
    play_time = str_to_int(play_time)
    adv_time = str_to_int(adv_time)               
    all_time = [0 for i in range(play_time + 1)]      # 0 부터 play_time까지의 리스트를 만들어줌

    for l in logs:
        start, end = l.split('-')
        start = str_to_int(start)
        end = str_to_int(end)
        all_time[start] += 1         # 누적합처럼 log의 start 지점과 end 지점에 1을 더하거나 빼줌
        all_time[end] -= 1

    for i in range(1, len(all_time)):        # 시청자 수 계산을 위한 누적합을 진행
        all_time[i] = all_time[i] + all_time[i - 1]

    for i in range(1, len(all_time)):        # 누적 시간 계산을 위한 누적합을 진행
        all_time[i] = all_time[i] + all_time[i - 1]

    most_view = 0
    max_time = 0                          
    for i in range(adv_time - 1, play_time):
        if i >= adv_time:
            if most_view < all_time[i] - all_time[i - adv_time]:
                most_view = all_time[i] - all_time[i - adv_time]
                max_time = i - adv_time + 1
        else:
            if most_view < all_time[i]:
                most_view = all_time[i]
                max_time = i - adv_time + 1

    return int_to_str(max_time)

문제풀이)

str형식을 int로 바꿔줘서 초 단위로 시간을 계산하는 str_to_int 함수와

초 단위 시간을 원래 str형식으로 바꿔주는 int_to_str 함수를 만듦

이 후 solution 함수에서 play_time과 adv_time을 초 단위 시간으로 바꿔줌

0초부터 play_time의 초 단위 시간만큼 0으로 채운 리스트를 all_time에 넣어줌

for문으로 logs를 돌면서 각 시청자마다 all_time에 start 지점에 1을 더하고 end 지점에 1을 빼줌

다음 for문으로 해당 초에 시청자 수를 계산하기 위한 누적합을 진행

다음 for문으로 해당 초에 시청자 수에 따른 누적 재생 시간을 계산하기 위한 누적합을 진행

누적 재생 시간을 담는 most_view, 광고 시작 시간을 담는 max_time을 만듦

for문으로 광고를 할 수 있는 시간을 모두 돌면서 0초에 광고를 시작할 때 else문을 그 이후에 시작한다면 if문을 돌고 그다음 if문에서 현재 돌고있는 i의 누적 재생 시간이 더 크다면 most_view는 현재 i의 누적 재생 시간이 되고 max_time은 현재 i의 광고 시작 시간이 됨

for문이 다 끝난 후 max_time을 원래 str형식으로 변환 후 리턴

 

테스트 결과) - 총합 8281.97ms

더보기
테스트 1 통과 (2.86ms, 10.4MB)
테스트 2 통과 (6.71ms, 10.6MB)
테스트 3 통과 (14.21ms, 11.2MB)
테스트 4 통과 (232.20ms, 28MB)
테스트 5 통과 (295.73ms, 34.2MB)
테스트 6 통과 (123.64ms, 21.5MB)
테스트 7 통과 (460.94ms, 41MB)
테스트 8 통과 (444.60ms, 45.8MB)
테스트 9 통과 (602.50ms, 54.3MB)
테스트 10 통과 (582.29ms, 54.7MB)
테스트 11 통과 (590.87ms, 52.2MB)
테스트 12 통과 (559.98ms, 49.7MB)
테스트 13 통과 (556.92ms, 54.6MB)
테스트 14 통과 (432.08ms, 40.8MB)
테스트 15 통과 (45.59ms, 15MB)
테스트 16 통과 (409.18ms, 40.9MB)
테스트 17 통과 (569.01ms, 54.7MB)
테스트 18 통과 (485.97ms, 42.2MB)
테스트 19 통과 (1.51ms, 10.5MB)
테스트 20 통과 (1.53ms, 10.5MB)
테스트 21 통과 (131.36ms, 20.2MB)
테스트 22 통과 (140.69ms, 20.3MB)
테스트 23 통과 (637.73ms, 47.1MB)
테스트 24 통과 (471.53ms, 40.9MB)
테스트 25 통과 (93.79ms, 19.6MB)
테스트 26 통과 (69.72ms, 15MB)
테스트 27 통과 (67.67ms, 17.5MB)
테스트 28 통과 (97.22ms, 17MB)
테스트 29 통과 (61.82ms, 16.7MB)
테스트 30 통과 (43.83ms, 14MB)
테스트 31 통과 (48.29ms, 14.9MB)

 

'프로그래머스-파이썬' 카테고리의 다른 글

외벽 점검  (0) 2022.11.01
양과 늑대  (0) 2022.11.01
기둥과 보 설치  (0) 2022.10.12
파괴되지 않는 건물  (0) 2022.10.03
자물쇠와 열쇠  (1) 2022.09.28

+ Recent posts