#월간 코드 챌린지 시즌2
문제
https://school.programmers.co.kr/learn/courses/30/lessons/77884
풀이
- 약수가 짝수개인 수는 더하고, 홀수개인 수는 뺀 값을 return한다.
- 약수의 개수가 짝수/홀수로 나뉘는 차이가 뭘까?
- 약수는 기본적으로 2개의 값이 짝을 이루는 형태이다. -> 일반적인 경우 짝수가 나온다
- 홀수가 나온다는 것은 짝 없이 1개로만 존재하는 약수가 있다는 것인데-> 제곱근이 존재하는 경우
- 따라서 if에 제곱근이 존재하는 경우 == true 로 설정해 -num을 해줬다 (else는 +num)
- 제곱근이 존재하는 경우를 판별하는 방법은?
- 처음에는 type을 이용해 type()의 결과를 String으로 변환 후, "<class 'int'>"와 직접적으로 비교하는 방식을 생각했지만, 깔끔하지 못한 것 같았고 무엇보다 오류가 발생
- 확인해보니 제곱근을 가지는 수도 루트를 씌웠을 경우 값이 x.00이런식으로 float형태로 나오는 것 같다.
- 따라서 루트를 씌운 값을 int형으로 변환했을 때, 변환 전과 값이 같은 경우 == 제곱근이 있다고 판별
- 만약 제곱근이 존재하지 않는 경우, 진짜 float값이 나올거고, int변환시 소수점 이하는 유실될 것이기에
- 처음에는 type을 이용해 type()의 결과를 String으로 변환 후, "<class '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'>"
'Algorithm > Programmars' 카테고리의 다른 글
[Python/Level.1] 2016년 (0) | 2022.07.20 |
---|---|
[Python/Level.1] 문자열 내 p와 y의 개수 (0) | 2022.07.12 |
[Python/Level.1] 음양 더하기 (0) | 2022.07.09 |
[Python/Level.1] 모의고사 (0) | 2022.07.09 |
[Python/level.1] 로또의 최고 순위와 최저 순위 [2021 Dev-Matching: 웹 백엔드 개발자(상반기] (0) | 2022.07.07 |