알고리즘/programmers

[ 프로그래머스 / 파이썬 ] 소수 찾기 (제곱근, 에라토스테네스의 체)

jungeun960 2021. 5. 13. 19:03

# 소수 찾기

  • 시간초과 1) 그냥 풀기 -> 테케 정확도 10,11,12 / 효율성 1,2,3,4 탈
def solution(n):
    answer = 0
    for num in range(2,n+1):
        count = 0
        for i in range(2,num):
            if num%i == 0:
                count+=1
        if count == 0:
            answer+=1
                
    return answer

  • 시간초과 2) 제곱근 사용하기 -> 테케 정확도 11 / 효율성 1,2,3,4 탈
    • 'N의 약수는 무조건 sqrt(N) 범위에 존재한다' 를 적용
def solution(n):
    answer = 0
    for num in range(2,n+1):
        count = 0
        for i in range(2,int(num**(0.5))+1):
            if num%i == 0:
                count+=1
        if count == 0:
            answer+=1
                
    return answer

  • 성공 ) 에라토스테네스의 체 사용
    • 소수(x)의 배수는 약수로 무조건 x를 포함하게 된다.
      따라서 절대 소수의 배수는 소수가 될 수 없다. 이를 이용한 것이 에라토스테네스의 체이다.
      누구나 알고있는 가장 작은 소수인 2부터 시작해서, 2의 배수를 다 지웠으면, 지워지지 않은 수 중에서 다음 값인 3의 배수를 지워나가고 이를 계속해서 반복해 나가면 소수만 남게된다.
      마치 체에 걸러서 남는 것들만 뽑아내는 방식이라고 생각하면 된다.
def solution(n):
    answer = 0
    n += 1                            # for문 사용을 위한 n += 1
    prime = [True] * n                # n개의 [True]가 있는 리스트 생성
    for i in range(2, int(n**0.5)+1): # n의 제곱근까지만 검사
        if prime[i]:                    # prime[i]가 True일때
            for j in range(2*i, n, i):    # prime 내 i의 배수들을 False로 변환
                prime[j] = False

    for i in range(n):              # 소수 카운팅
        if i > 1 and prime[i] == True:  
            answer+=1
                
    return answer

 

+ (GOOD) 풀이 set을 사용한 에라토스테네스의 체

  • 2~n까지의 수를 함수 num에 담기
  • 2~int(n**0.5)+1까지의 수 i 에 대해, i 가 num 안에 있으면, i의 배수set(i의 2배수 부터 n까지수 중 i 만큼 간격있는 수들)를 num에서 빼주기
  • 나머지 num의 길이 리턴
def solution(n):
    num=set(range(2,n+1))
    
    for i in range(2,int(n**0.5)+1):
        if i in num:
            num-=set(range(2*i,n+1,i))
            
    return len(num)

 

 

# 서울에서 김서방 찾기

def solution(seoul):
    return '김서방은 ' + str(seoul.index('Kim')) + "에 있다"

 

# 이상한 문자 만들기

  • 공백 처리에 주의할 것 
def solution(s):
    answer = ''
    count = 0
    for a in s:
        if a==" ":
            answer+=" "
            count=0
        else:
            count+=1
            if count%2==0:
                answer+= a.lower()
            else:
                answer+= a.upper()

    return answer

 

# 정수 제곱근 판별

def solution(n):
    answer = 0
    j = n**(1/2)
    if j == int(j):
        answer = (j+1)**2
    else:
        answer = -1
    return answer

 

반응형