Algorithm/Programmars

[Python/Level.1] 약수의 개수와 덧셈

mopipi 2022. 7. 12. 01:01
반응형

#월간 코드 챌린지 시즌2

문제

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

 

프로그래머스

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

programmers.co.kr

풀이

  • 약수가 짝수개인 수는 더하고, 홀수개인 수는 뺀 값을 return한다.
    • 약수의 개수가 짝수/홀수로 나뉘는 차이가 뭘까?
    • 약수는 기본적으로 2개의 값이 짝을 이루는 형태이다. -> 일반적인 경우 짝수가 나온다
    • 홀수가 나온다는 것은 짝 없이 1개로만 존재하는 약수가 있다는 것인데-> 제곱근이 존재하는 경우
  • 따라서 if에 제곱근이 존재하는 경우 == true 로 설정해 -num을 해줬다 (else는 +num)
  • 제곱근이 존재하는 경우를 판별하는 방법은?
    • 처음에는 type을 이용해 type()의 결과를 String으로 변환 후, "<class 'int'>"와 직접적으로 비교하는 방식을 생각했지만, 깔끔하지 못한 것 같았고 무엇보다 오류가 발생
      • 확인해보니 제곱근을 가지는 수도 루트를 씌웠을 경우 값이 x.00이런식으로 float형태로 나오는 것 같다.
    • 따라서 루트를 씌운 값을 int형으로 변환했을 때, 변환 전과 값이 같은 경우 == 제곱근이 있다고 판별
      • 만약 제곱근이 존재하지 않는 경우, 진짜 float값이 나올거고, int변환시 소수점 이하는 유실될 것이기에
  • 루트를 씌우는 방법은 (1) math 라이브러리 함수 이용 (2) (직접) 0.5승 처리

코드

1. math 라이브러리 - sqrt() 사용

import math
def solution(left, right):
    return sum(-num if math.sqrt(num) == int(math.sqrt(num)) else num for num in range(left, right+1))

- 저번 문제 풀 때 매우 심플해져서 눈여겨보던 한 문장에 if문 작성을 적용해봤다.

제곱근 값을 도출하는 함수인 sqrt 이용하기 위해 math 라이브러리를 import해 사용했다.

확실히 더 깔끔하긴 하다..

하지만 라이브러리를 사용할 수 없는 경우에 대비해 sqrt 없이도 작성했다.

 

2. 직접 제곱근 도출 - **(0.5)

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

루트가 0.5제곱인 것을 이용

다른 풀이

  • pow를 이용해, -1의 지수를 상황에 따라 홀/짝 조절해 -num, +num을 구현할 수 있었다.

 

+

1. sqrt()

  • math 라이브러리 내장함수 중 하나로 제곱근을 구해줌

2. type()

  • String 변환 필요없이, if문에서 is [타입명]으로 판별 가능
if type(a) is list/int/float/str ... :

3. isinstance()

  • 인자로 전달된 객체가 type과 일치하는지/ subclass인지 boolean값 반환
>>>print(isinstance(123,int))
True
#응용 ver
>>> if isinstance(123,int):
>>>	print("is int")
"is int"

4. str(), int()

  • 각각 자료형을 str, int로 변환시켜 주는 함수
if str(type(num**(0.5))) == "<class 'int'>"

 

반응형