본문 바로가기

TIL 통합/Python

Python - 약수의 성질(제곱근 이용), zip 함수

카타

 

<문제 33. 약수의 개수와 덧셈>

작성한 답

def solution(left, right):
    result = 0
    for x in range(left, right+1, 1):
      if len([n for n in range(1, x+1, 1) if x%n==0])%2 == 0:
        result += x
      else:
        result -= x
    return result

맞을까 맞을까 조마조마했는데 한 번에 맞아서 스스로도 조금 당황하고 신기했던 문제. 이제 나도 파이썬에 함수 작성하는 기초는 좀 생긴듯?

 

더 간단한 답 : 역시 고수는 다르다

def solution(left, right):
    answer = 0
    for i in range(left,right+1):
        if int(i**0.5)==i**0.5:
            answer -= i
        else:
            answer += i
    return answer

포인트 정리

  • i**0.5 : i의 제곱근 구하는 식
  • 약수의 성질
    • 제곱근이 정수로 표현 가능 : 약수의 개수 홀수 => i의 제곱근에서 정수만 취한 부분 = i제곱근
    • 제곱근이 정수로 표현 불가능 : 약수의 개수 짝수 => i의 제곱근에서 정수만 취한 부분 != i 제곱근

 

 

<문제28. 없는 숫자 더하기>

작성한 답

def solution(numbers):
    temp = [x for x in range(0, 10)]
    for n in numbers:
        temp.remove(n)
    return sum(temp)

 

더 간단한 답

def solution(numbers):
    return sum([x for x in range(0, 10) if x not in numbers])

졸린다고 해도 이정도는 이제 생각해낼 줄 알아야 할 때다.

 

'찢은' 답 : 세상에 천재는 많다ㄷㄷ

 

def solution(numbers):
    return 45 - sum(numbers)

 

 


<문제 32. 내적>

작성한 답

def solution(a, b):
    sum = 0
    for x in range(0, len(a)):
        sum += a[x]*b[x]
    return sum
def solution(a, b):
    sum = 0
    for i, x in enumerate(a):
        sum += a[i]*b[i]
    return sum

아래의 경우, enumerate을 워낙 오랜만에 쓰는지라 용법 때문에 잠깐 헷갈렸지만 챗지피티의 도움으로..ㅎ그럭저럭 잘 작성했다.

 

 

고수의 답

def solution(a, b):

    return sum([x*y for x, y in zip(a,b)])

포인트

  1. for문에서 요소 두 개 이상 할당 가능
  2. zip 함수
    • 둘 이상의 배열을 '순서대로' 짝지어줌
    • 배열의 길이가 다를 경우 짧은 쪽 기준으로 맞춰짐