내일배움캠프 35일차

2023년 05월 03일 by barryjung

    내일배움캠프 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사용에 더 익숙해 져야 겠다.