- 내일배움캠프 35일차 목차
[오늘 한일]
- 알고리즘 문제풀이
- AWL강의 수강
[오늘 배운점]
파이썬
<약수개수를 구하는 빠른 방법>
오늘 문제를 풀며 팀원분께 배우게된 방법이다.
어떤 수의 약수 갯수를 구해야 한다면 어떻게 빠르게 구할수 있을까.
더 어려운 방법도 있을수 있겠지만, 제곱근을 이용하면 쉽고 빠르게 구할수 있다.
어떤 수의 약수들의 집합은 제곱근을 기준으로 큰수와 작은수로 반으로 나눠진다.
제곱근보다 작은 약수들은 그 짝인 큰 약수들을 가지고 있다.
그래서 제곱근을 먼저 구한다음,
그보다 작은수들을 모두 검사하면서 약수인지 확인하여 개수하면,
그 두배만큼의 수가 약수의 개수가 된다.
마지막으로 제곱근 자체가 약수가 되는지 확인해서 개수 1을 더해주거나 더하지 않는다.
number**0.5
제곱근은 이렇게 구할수 있다.
<문자열의 반복은 *로 하자>
팀원분께서 문제 푸시는걸 보고 배운점이다.
어떤 반복수만큼 반복된 문자를 만들어야 하는 상황이 있다면,
반복문을 쓰거나, 리스트 컴프리헨션을 사용할 필요없이,
문자를 길이만큼 곱하는 방법이 있다.
예컨대 핸드폰 가리기라는 문제에서,
가려야할 숫자만큼 *을 작성하는 방법은 아래처럼 할수있다.
answer = len(phone_number)-4)*"*" #*******
심플하지만 놓칠수 있는 부분 같다.
길이만 구하면 반복문을 쓸필요 없으니 잘 기억해야겠다.
<등차수열의 합을 구하는 식>
'부족한 금액 계산' 문제를 풀며 팀원분께 배운점이다.
n차례만큼 물건을 사는데 물건가격은 n*가격으로 올라가는 상황이다.
이럴때는 반복문이 먼저 떠오르지만 다른 해결법도 있다.
물건 가격은 고정이니까, 물건가격 곱하기 (n이 다 합쳐진 수)를 구하면 된다.
그럼 n이 다 합쳐진 수는?
이것도 반복문으로 구할수 있겠지만, 이 반복문도 생략할수 있다.
1~n까지의 모든 수.
이런걸 등차 수열이라고 할수있다.
등차수열의 합을 구하는 식을 안다면 식 한번으로 구할 수있다.
n*(n+1)/2 를 하면 등차수열의 합을 구할 수 있다.
결론, 이런 수학적인 방법을 쓰는 것으로 시간복잡도를 줄일수 있다.
그리고 이런 해결방법을 요구하는 문제들이 종종 있는 것 같다.
문제에서 어떤걸 요구하는지 잘 파악하려면 수학공식은 알게되는대로,
기억해두는게 좋을것 같다.
<zip함수 사용방법>
zip함수는 리스트 여러개의 요소들을 모아주는 동작을 한다.
아직 완전히 익숙하진 않지만 오늘 알게된 부분만큼으로 예제를 만들어 봤다.
array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
answer = [[x, y, z] for x, y, z in zip(array[0], array[1], array[2])]
print(answer) #[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
이런식으로 zip안에 주어진 리스트들을, 묶어서 한차례씩 반환해준다.
그걸 위처럼 x, y ,z 각변수에 담아서, 각각 쓰거나 리스트로 만들수도 있고,
딕셔너리로 만드는 것도 한가지 노하우이다.
어떤 행렬을 이중 리스트로 만든 리스트에서 행과 열을 뒤집는데 매우 편리하다.
두 리스트를 취급하는 반복문을 쓸때도 유용할것 같다.
결론, zip사용에 더 익숙해 져야 겠다.