0131 TIL

looggi·2023년 1월 31일
1

스파르타 내배캠 AI-3

목록 보기
130/130
post-thumbnail

프로그래머스 문제풀기

➡️ 약수의 합

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사용하면 더 좋고 대신 정수 제곱근이 있는 수에 대해서는 예외처리가 필요함

리스트 축약식 조건문

딕셔너리 정렬

  • 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

      파이썬은 로직에 집중할 수 있도록 부가적인 부분은 런타임이 대신처리해 준다라..

vscode 단축키

https://andaeng.tistory.com/46

profile
looooggi

0개의 댓글