def solution(n):
divisor=[]
for i in range(n):
if n%(i+1)==0:
if i+1 in divisor:
break
if i+1 == n//(i+1):
divisor.append(i+1)
else:
divisor.extend([i+1,n//(i+1)])
return sum(divisor)
나는 두개씩 집어넣었는데 보통 하나씩 집어넣긴하지..흠
def solution2(n):
divisor=[]
for i in range(int(n**0.5)):
print('2:',i)
if n%(i+1)==0:
if i+1 == n//(i+1):
divisor.append(i+1)
else:
divisor.extend([i+1,n//(i+1)])
return sum(divisor)
정수n의 범위가 크다면 num ** 0.5
의 효율성이 더 좋아요. 당장 n = 3000일때만 보면 n //2 = 1500번 for문이 돌아가고, n ** 0.5 == 54.xxx로 최대 55번 for문 돌아갑니다. 수가 더 커질수록 차이가 심하죠.
중복제거는 n이 완전제곱수인지 확인하는 if int(n ** 0.5) == n ** 0.5
로 예외처리해서 빼주면 됩니다.
if문도 딱 한번 확인하는거니 효율성에 의미있는 영향을 주지않습니다.
❓근데 진짜 한번만 확인하는건가..? 그냥 그 조건이 맞아서 실행되는 게 딱 한번인거지 확인은 계속 하는 거 아닌가????
→ solution2 보면 나는 if를 매번 확인하니까 효율성이 별로 좋진 않을 것 같다고 생각했는데 윗분 말대로라면 if가 한번만 실행되니까 별로 상관이 없는건가?? 그럼 오히려 if랑 else의 순서를 바꾸면 i+1이랑 n//i+1이랑 다른 걸 계속 확인해줘야하니까 그게 더 별론가?
def sumDivisor(num):
return sum([i for i in range(1,num+1) if num%i==0])
이건 처음부터 자기 자신까지 다 돌면서 다 나눠보고 sum에 넣어서 출력하는거고
def sumDivisor(num):
# num / 2 의 수들만 검사하면 성능 약 2배 향상잼
return num + sum([i for i in range(1, (num // 2) + 1) if num % i == 0])
처음부터 n//2까지만 돌면서 약수에 해당하는 건 자기자신빼고 sum으로 다 더하고 자기 자신은 첨에 받은 값 num을 사용해서 더함
여기서 num//2대신 num**0.5사용하면 더 좋고 대신 정수 제곱근이 있는 수에 대해서는 예외처리가 필요함
and: and 없이 조건문을 나열하면 모두 AND 조건으로 계산된다
or: 하나의 if 문에서 or 연산자로 논리 연산을 묶어줘야 한다
조건문 안에 조건문을 쓰는 경우 if - else까지 쓰고 else안에서 다시 if를 쓸 수 있다
[f(x) if condition else g(x) for x in sequence]
https://stackoverflow.com/questions/9987483/elif-in-list-comprehension-conditionals
sorted(정렬할 대상, 정렬 기준) → 결과값은 리스트
key 기준으로 정렬해서 키값이 담긴 리스트 반환하기
sorted(dictionary) → 내장함수니까 변수에 할당 가능 → k_sorted = sorted(dictionary)
value 기준으로 정렬해서 키값이 담긴 리스트 반환하기
v_sorted = sorted(dictionary, key=lambda x : dictionary[x]) → dictionary[x]가 밸류값이니까
정렬 후 딕셔너리로 바꾸려면 1. 딕셔너리에 있는 key, value를 items()로 한 쌍씩 튜플에 순서대로 담아서 2. sorted로 정렬하면(기본적으로 key값을 기준으로 정렬됨) 리스트에 담기고 3. 그걸 다시 dict()에 넣어줌. = 정렬 후 원래 모양 복귀
dict_sorted=dict(sorted(dictionary.items())) --- items()를 쓰면 리스트에 (키,밸류)가 담겨져서 나옴
dict_sorted.keys() → key값만 리스트에 담겨서 나옴
dict_sorted.values() → value값만 리스트에 담겨서 나옴
https://velog.io/@loooggi/0213-TIL
위의 정렬부분에서 value로 정렬하고 싶다면
dict_sorted=dict(sorted(dictionary.items(), key=lambda x:x[1]))
→ 튜플로 (key, value) 담기니까 value는 x[1]
https://angelplayer.tistory.com/205
❓아니근데 오늘했던거 중에 sum(리스트 축약식.append(lam(n)))
이거는 타입에러 떴었는데 왜 얜 딕셔너리 메소드 쓰고나서 내장함수 두번이나 쓰는데도 에러가 안나지 모야이거?? → 내 생각에 .items()하면 결과가 리스트라서 가능한듯 ??? 이것도 딕->리로 완전 변하는거면 똑같은데 왜 얘마 ㄴ되는거지????????????? 데이터 타입별 메소드는 변수에 할당이 안되니까 자체적으로만 뙇 써야하고 변수에 할당할 수 있는건 걍 값처럼 아무데나 쓸 수 있는거 아닌가?.?
❗아근데.append한건 그냥 그앞의 축약식으로 만든 리스트에 바로 반영이 되는거라서 append를 쓴거 자체를 어디다가 쓰려고 하면 안되는듯
TypeError: 'NoneType' object is not iterable → sum을 하려고 보니까 append에 들어가는 lam(n)이 제곱근이 있다면 제곱근 값이거나 없다면 0이었는데 그게 문제였나 뭐가문제였지❓누군가가 none값이어서 sum이 실행될 수 없었던 것 같음.. 그게 바로 .append()때문이었던듯 ⁉️
NoneType
“아무것도 반환하지 않는”함수의 반환 값
무언가를 검색하고 찾을 수 있거나 찾을 수없는 함수에 대한 일반적인 기본 반환 값
None의 데이터 타입이기도 함
http://daplus.net/python-nonetype%EA%B0%9C%EC%B2%B4-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C/명시적인 return 이 필요한 부분은 실제 return을, 그렇지 않은 부분은 런타임에 맡겨 NoneType이 리턴되도록 할 수 있습니다.
https://sabarada.tistory.com/89
파이썬은 로직에 집중할 수 있도록 부가적인 부분은 런타임이 대신처리해 준다라..