시리즈: TIL (1개 글)
Python 까먹기 전에 다시.
이런저런 코테 준비 겸, F1과 각종 데이터들에 대해서 조금 경량으로 구현하는 방법은 뭐가 있을까 해서 무리없이 접근 할 수 있을 것 같은 파이썬을 다시 공부하기로 했다.
이번에 도움을 줄 책은 예~전에 사두었던 “자료구조와 함께 배우는 알고리즘 입문”
싸피에서 배웠던 익숙한 내용들과, 해당 내용을 다시 한 번 배우는 느낌으로 차근차근 접근해보려고 한다.
아마 파이썬으로 알고리즘을 풀고 나서, 추후에 같은 문제를 여러가지 언어로 풀어보는 것 또한 하나의 알고리즘 학습이 될 수 있다는 생각이 들어서 바로 트라이 트라이!
아무래도 개인 학습 정리의 성격이 강한 게시물이 될 것 같다.
학습내용~
N진법 변환해보기
def conv(x: int, r: int) -> str:
"""X를 r진법으로 변경한 뒤 str로 반환하는 함수."""
d = "" # 변환 후 문자
dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
while x > 0:
d += dchar[x % r]
x //= r
return d[::-1] # 역순 출력
특정 범위 내 소수 구하기
z / y = x 가 나누어 떨어진다면
z / x = y 또한 나누어 떨어진다.
(약수는 대칭적임)
따라서 제곱근까지만.
증명…
- 합성수 N의 가장 작은 약수를 a라고 하자.
- N = a * b 로 나타낼 수 있다.
- a는 가장 작은 약수라고 정의했으므로 a <= b 가 성립한다.
- a _ a <= a _ b (양 변에 a를 곱해도 부등식의 방향은 변하지 않는다.)
- a^2 <= N (2번)
- a <= sqrt(N) 다.
즉 약수 탐색은 해당 이유로, 제곱근까지만 검사하면 된다. (휴)
에라토스테네스의 체
def get_prime_numbers_until(x: int) -> list:
"""
주어진 숫자 x까지의 모든 소수를 에라토스테네스의 체를 이용해 찾습니다.
"""
if x < 2:
return []
primes = [True] * (x + 1)
primes[0] = primes[1] = False
for i in range(2, int(x**0.5) + 1):
if primes[i]:
for j in range(
i * i, x + 1, i
):
primes[j] = False
prime_numbers = [i for i, is_prime in enumerate(primes) if is_prime]
return prime_numbers
무난히 나오는 모습~
얕은 복사 깊은 복사
# 얕은 복사
x = [[1,2,3], [4,5,6]]
y = x.copy()
x[0][1] = 9 # shallow copy
print(y)
[[1,9,3],[4,5,6]]
# 앗!
# 그럼 어떻게 해결하지?
# 깊은복사!
import copy
z = copy.deepcopy(x)
# 이러면 서로 상호작용 X
얕은 복사 : 빠름빠름맨, 메모리 굿.
깊은 복사 : 독립성 굿, 다만 메모리 증가, 속도 저하.
뜬금없지만 자바스크립트에서 얕은 복사 / 깊은 복사는 다음과 같다.
얕은 복사 :
const arr = [1, 2, 3, 4];
const copied = arr.slice();
const copied2 = [...arr];
const copied3 = Array.from(arr);
깊은 복사 :
const arr = [1, 2, 3, 4];
const deepcopied = JSON.parse(JSON.stringify(arr));
쩝. 파이썬 멋지네…
마무리하며
후아…
기초중의 기초였지만… 그래도 뭔가 해냈다!
멋지다 멋지다 멋지다