thyung   3년 전

안녕하세요, 제가 처음에는 파이썬으로 코드를 짜고 계속해서 시간초과가 나와서 같은 논리로 C++로 작성하여서 통과하였습니다.

파이썬이 C++보다 느린 것은 알고 있었지만, 같은 논리인데도 통과 못 할 정도로 차이가 나는가 싶어서 질문드리게 되었습니다.

그렇다면 알고리즘을 풀 때 파이썬보다는 C++로 짜야 할까요..

아니면 제가 틀린 부분이나 비효율적인 부분 알려주시면 감사하겠습니다.

파이썬 코드를 위에 올렸는데, </i>등이 붙어서 나오네요.. 제가 일단 수정했는데 인덴트가 약간씩 안 맞을 수 있을 것 같습니다.

import collections
import sys
N, M, B = map(int, input().split())
grounds = [] # 땅의 높이를 기록
maxh = 0 # 처음 땅의 최대 높이
minh = 0# 처음 땅이 최소 높이
ans_time = [] # 걸리는 시간을 기록
ans_height = []# 작업 후 땅의 높이를 기록

# 조건 입력 및 최대/최소 높이 구하기
</i>for i in range(N):
    line = list(map(int, sys.stdin.readline().rstrip().split()))
    temp_maxh = max(line)
    temp_minh = min(line)
    if maxh<temp_maxh: maxh = temp_maxh
    if minh>temp_minh: minh = temp_minh
    grounds.append(line)

for h in range(minh, maxh+1):
    need_block = 0
    need_time = 0
    for i in range(N):
        d = collections.Counter(grounds[i]) # 각 줄마다 높이들의 개수 계산
        c = d.most_common()
        for j in range(len(c)):
            high, num = c[j]
            #각 줄마다 필요한 시간 및 블록 개수 구함
            if h<high:
                need_block = need_block - (high-h)*num
                need_time = need_time + 2*num*(high-h)
            elif h>high:
                need_block = need_block + (h-high)*num
                need_time = need_time + num*(h-high)
    # 필요한 블록이 가지고 있는 것보다 적거나,걸리는 시간이 기존 것보다 더 걸리면 continue
    if need_block>B or (len(ans_time)!=0 and min(ans_time)<need_time): continue
    else:
        ans_height.append(h)
        ans_time.append(need_time)
min_time = min(ans_time)
ans_arr = []
for i in range(len(ans_time)):
    if ans_time[i]==min_time:
        ans_arr.append(ans_height[i])
print(f"{min_time} {max(ans_arr)}")

3587jjh   3년 전

계산량이 n억대이거나 알고리즘이 무거우면 c++은 통과하고 파이썬은 통과하지 못하는 경우가 꽤 많습니다. 심지어 파이썬 정답자가 없는 문제도 가끔씩 보입니다.

thyung   3년 전

3587jjh님 감사합니다. 요즘 ML에 관심이 생겨서 파이썬 연습을 하려고 시작하고 있는데, 알고리즘은 C++로 하는 것이 맞는 걸까 고민되어서 글 남겨 봅니다.

댓글을 작성하려면 로그인해야 합니다.