강의로 돌아가기
정예슬

python 테스트케이스 1 시간초과[코드첨부]

나머지 통과, 테케 1에서만 시간초과가 나는데
이유가 뭘까요??? 도와주세여

작성중인 코드―solution.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def jinsu(n, k) :
    jinsu = ''
    while n > 0 :
        n, mod = divmod(n, k)
        jinsu += str(mod)
    return jinsu[::-1]

def isprime(i) :
    if i == 1:
        return False
    elif i == 2 :
        return True
    for n in range(2, i) :
        if i%n == 0 :
            return False
    return True

def solution(n, k) :
    clu = jinsu(n, k).split('0')
    prime = []
    for c in clu :
        if c.isdigit() and isprime(int(c)) :
            prime.append(int(c))
    return len(prime)
  • 최현웅

    isprime 메서드에서 약수 구하는 공식을 더욱 줄여보세요. i // 2로 하는 것은 연산을 딱 반으로 줄여줄 수 있고, 루트를 활용한 방법은 엄청난 연산 단축을 기대할 수 있습니다

    최현웅―2022.01.20 18:05
1 개의 답변
김종도
  1. 시간 초과나는 경우가 언제 있을지 생각해볼 필요가 있습니다. 큰 수를 진법 변환을 했을 때 0이 등장하지 않는 수로 변환이 됐을 때를 생각해봅시다
  2. 그렇다면 그 긴 수는 얼마나 길까요? 문제 조건을 따져보면 1,000,000에 가까운 수를 3진법으로 변환할 때 가장 크지 않을까요???
  3. 가장 긴 수를 2부터 n까지 순회하면서 나눠지는지 판별하는 것은 굉장한 시간소요를 필요로 합니다. 그런데 2 ~ n까지의 수를 순회하면서 나눠떨어지는지 판별할 필요가 있을까요? (추가로 에라토스테네스의 체를 사용하는 것이 좋은 방법일까요?)
  4. 36이라는 수를 소수판별할 때 우리는 2,4,6,9,18로 나눠떨어지는 것을 알기 때문에 소수가 아닌 것을 알지만 2~6까지만 순회를 해봐도 36이라는 숫자는 앞서 언급한 5개의 숫자로 나눠떨어지는 것을 알 수 있습니다. 그 이유는 i가 2일 때 18과 짝지어지고 4는 9 그리고 6은 6과 짝지어지기 때문입니다.
  5. 따라서 n이라는 숫자를 소수판별할 때 2~n의 제곱근까지만 판별해도 소수판별이 가능합니다
  • freezinghands

    도움이 되었습니다. 감사합니다

    freezinghands―2022.02.02 11:04
  • 천세희

    같은 상황으로 1번만 실패했는데 답변 덕분에 풀었습니다! 감사합니다.

    천세희―2022.03.24 11:02
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.