코딩/프로그래머스

[프로그래머스/파이썬] Lv1. 기사단원의 무기

kerp 2023. 1. 29. 23:06

> 문제

> 코드

def solution(number, limit, power):
    n_dic={}

    for n in range(1,number+1):
    	#공약수 구하기
        div1 = []
        for i in list(range(1,int(n**(1/2)+1))):
            if n%i ==0: div1.append(i)
        div2 = [n//di for di in div1]
        div1.extend(div2)

#####
        len_div = len(set(div1))

        len_div = len_div if len_div<=limit else power
        n_dic[n]= len_div
        
    answer = sum(n_dic.values())
#####
    return answer

이번 것도 수월하게 풀었다. 

다만 ##### 사이 네 줄을 한 줄로 줄여버릴 수 있었는데 그걸 못해서 원통하다... 

다른사람 풀이를 보니 function을 하나 더 만들어서 해결했더라고. 공약수를 구하는 두번째 for문을 function으로 만들고, 뒷부분을 한 줄로 줄이면

def solution(number, limit, power):
	#공약수구하기
    def cf(n):
        div = []
        for i in list(range(1,int(n**(1/2)+1))):
            if n%i ==0: 
                div.append(i)
                div.append(n//i)
        return (len(set(div)))
    #문제답구하기
    return sum([len_n if (len_n:=cf(n)) <=limit else power for n in range(1,number+1)])

이런식으로! 깔끔하게! 적을 수 있다.

+ := 쓸 때는 제일 먼저 변수가 선언되는 곳에다가 쓰는 걸 잊지말자, , , 

(맨 처음 나온 len_n에 생각없이 붙였다가 에러떴다)

그리고 :=이친구 처음에는 활용 잘 못했는데 이렇게 쓰니까 되게 되게되게 연산을 편하게 해주네!