
용어
mutable 자료형: 원소를 변경할 수 있는 자료형 => 파이썬에서의 list, dict, set 등
immutable 자료형: 원소를 변경할 수 없는 자료형 => 파이썬에서의 tuple, str 등
unpack: list/tuple의 원소값들을 풀어 여러 변수에 대입하는 것
slice: list/tuple의 원소 일부를 새로운 list/tuple로 만드는 것
누적변수: n += 1, x -= 3 등에서 n, x를 누적변수라 함
data structure(자료구조): 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계
equality(등가성): '=='을 통해 비교하며, 두 '값'이 같은지 비교
identity(동일성): 'is'를 통해 비교하며, 값은 물론 식별 번호까지 같은지 비교
내포 표기 생성: list 안에서 for, if문을 사용해 새로운 리스트를 생성하는 기법
ex) 1_to_10_even_list = [num for num in range(1, 11) if not num % 2]
scan = traverse = 주사: 배열의 원소를 하나씩 차례로 주목하여 살펴보는 것
모듈객체 name: 스크립트 프로그램이 직접 실행될 때 변수 __name__은 '__main__'
스크립트 프로그램이 import되어 실행될 때 변수 __name__은 '.py를 제외한 파일명'
pseudo code(의사코드, 수도코드): 컴퓨터로 실행할 수는 없지만 알고리즘을 간단하게 나타낸 코드
shallow copy(얕은복사): 리스트 안의 원소가 1차적으로 참조하는 곳까지만 복사하는 것
deep copy(깊은복사/전체복사): 리스트 안의 원소와 그 구성원소(원소의 원소)까지 복사하는 것
=> 얕은 복사로 y = x.copy() 실행 시 y값 변경 시 x값도 변경 될 수 있음
=> 깊은 복사로 y = copy.deepcopy(x) 실행 시 위 현상 예방 가능
실습
d = ""
dchar = "0123456789ABCDEF"
while True:
n = int(input("n값을 입력해주세요(최대 16): "))
if not 2 <= n <= 16: continue
num = int(input("바꿀 값을 입력해주세요: "))
while num:
d = dchar[num % n] + d
num //= n
print(f"{n}진수로 변환된 값은 '{d}'입니다.")
break
# 실행결과 ==========================================
n값을 입력해주세요(최대 16): 16
바꿀 값을 입력해주세요: 422
16진수로 변환된 값은 '1A6'입니다.
"""
기본 개념
1. n이 소수라면 2부터 n-1까지 어떤 정수로도 나누어 떨어지지 않는다.
1-2. n이 소수라면 2부터 n-1까지의 어떤 소수로도 나누어 떨어지지 않는다.
1-3. n이 소수라면 n의 제곱근 이하 어떤 소수로도 나누어 떨어지지 않는다.
"""
prime_numbers = [2, 3]
counter = 0
for i in range(5, 1001, 2):
j = 1
while prime_numbers[j] * prime_numbers[j] <= i:
counter += 2
if not i % prime_numbers[j]: break
j += 1
else:
counter += 1
prime_numbers.append(i)
print("1부터 1000까지의 소수는 다음과 같습니다.")
print(prime_numbers)
print(f"총 나눗셈 실행 횟수는 {counter}회 입니다.")
# 실행결과 ==========================================
1부터 1000까지의 소수는 다음과 같습니다.
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
총 나눗셈 실행 횟수는 3774회 입니다.
정리
소수 구하기 알고리즘은 흥미로운 부분이 많았다.
처음 단순한 로직에서는 나눗셈 실행 횟수가
7만 회에 달했던 것에 반해, 몇 번의 간단한 사고를 거치니
3천 회로 거의 5% 수준까지 실행 횟수를 줄인 것이다.
중요한, 자주 활용되는 로직일수록 좋은 알고리즘을
넣어야 한다는 점을 몸소 깨달았다.