많은 프로그래밍 언어가 나머지 연산자를 제공합니다. 하지만 언어마다 결과가 다를 때가 있습니다. C언어, Java, Python, Javascript 네 가지 언어에 대해 나머지 연산자를 비교해 봅시다. 모듈러 위키 백과를 보면 `모듈러 산술(Modular Arithmetic)`를 다음과 같이 정의합니다. 💡 모듈러 산술 혹은 합동 산술은 정수의 합과 곱을 어떤 주어진 수의 나머지에 대하여 정의하는 방법이다. 임의의 정수 $a, b$가 있을 때, 정수 $n$에 대해 $a=b+kn$을 만족시키는 정수 $k$가 존재한다면 $a$와 $b$는 같은 동치류에 속하고 $n$에 대해 합동이라고 합니다. 기호로는 다음과 같이 씁니다. $a\equiv b\space(\text{mod}\space n)$ $n=3$일 때 ..
Python
최악의 경우 $\Theta(n^2)$의 시간복잡도를 갖지만 $\Omicron(n\log n)$ 평균적으로 가장 좋은 성능을 보이고 구현이 쉬워 현업에서 가장 많이 쓰인다고 알려진 퀵 정렬을 알아보고 자바와 파이썬으로 구현해 봅시다. 자료구조, 알고리즘 시리즈 모아보기 퀵 정렬 `퀵 정렬(quick sort)`은 병합 정렬 알고리즘과 비슷하게 입력을 나누어 각각에 대해 재귀적으로 정렬하는 알고리즘입니다. 퀵 정렬과 병합 정렬의 차이점은 크게 두 가지가 있습니다. 퀵 정렬은 병합 정렬과 달리 합치는 과정이 없고 입력을 항상 반씩 균등하게 나누지 않습니다. 퀵 정렬은 기준값정하고 기준값보다 큰 값들과 작은 값들로 입력을 분할합니다. 이때 기준값을 `피벗(pivot)`이라 합니다. - Pseudocode qui..
지금까지 기본적인 시간 복잡도가 $\Omicron(n^2)$인 정렬 알고리즘들을 알아봤습니다. 선택 정렬, 삽입 정렬, 버블 정렬은 모두 평균 $\Theta(n^2)$의 시간 복잡도를 가졌고 삽입정렬과 개선된 버블 정렬은 최선의 경우 $\Theta(n)$의 시간 복잡도를 가졌습니다. 이번에는 평균 $\Theta(n\log n)$의 시간 복잡도인 고급 정렬 알고리즘들에 대해 알아봅시다. 자료구조, 알고리즘 시리즈 모아보기 병합 정렬 `병합 정렬(merge sort)`은 입력을 반으로 나누어 각각 정렬한 뒤 합치는 재귀 알고리즘입니다. "정렬하는 방법이 반으로 나눈 뒤 각각 정렬하는거면 각각은 어떻게 정렬하라는 거지?" 싶을 수 있습니다. 재귀적으로 입력을 반으로 나눠 정렬하다보면 어느 순간 입력의 크기는 ..
그 유명한 버블 정렬에 대해 알아보고 C++, 자바, 파이썬으로 구현해 봅시다. 자료구조, 알고리즘 시리즈 모아보기 버블 정렬 `버블 정렬(bubble sort)`은 선택 정렬처럼 가장 큰 원소를 끝으로 옮기는 작업을 반복하는 알고리즘입니다. 선택 정렬이 큰 값을 콕 찍어서 옯겼다면 버블 정렬은 한쪽 끝에서 긁어 올라가며 더 큰 값만 가지고 올라가는 방식입니다. 이렇게 논리적으로 아래에서부터 수면 위로 올라가는 모습을 컴퓨터 과학에서는 버블링이라고 합니다. DOM트리에서 일어나는 이벤트 버블링도 아래에서 위로 올라가는 의미의 버블링이죠. - Pseudocode 정렬해야 하는 배열 A[n]이 주어졌을 때 버블 정렬 알고리즘은 다음과 같습니다. bubbleSort(A[], n){ for( last ← n d..
정렬 알고리즘 중 삽입 정렬을 알아보고 C++, 자바, 파이썬으로 구현해봅시다. 자료구조, 알고리즘 시리즈 모아보기 삽입 정렬 `삽입 정렬(insertion sort)`은 정렬된 부분을 하나씩 확장해 가며 모든 수열을 정렬하는 알고리즘입니다. - Pseudocode 정렬해야 하는 배열 A[n]이 주어졌을 때 삽입 정렬 알고리즘은 다음과 같습니다. insertionSort(A[], n){ for( last ← 2 to n ) A[1 ⋯ last] 에 A[last]가 들어갈 곳을 찾아 넣는다; } 구체화하면 아래와 같습니다. insertionSort(A[], n){ for( last ← 2 to n ){ newElement ← A[last]; // 추가할 요소 i ← last-1; // newElement와..
정렬 알고리즘에서 가장 기본이 되는 선택 정렬을 알아보고 C++, 자바 그리고 파이썬으로 구현해봅시다. 자료구조, 알고리즘 시리즈 모아보기 선택 정렬 `선택 정렬(selection sort)`은 정렬할 수열에서 가장 큰 값(혹은 가장 작은 값)을 선택해 한쪽 끝으로 옮기는 행위를 반복하여 정렬하는 알고리즘입니다. - Pseudocode 정렬해야 하는 배열 A[n]이 주어졌을 때 선택 정렬 알고리즘은 다음과 같습니다. selectionSort(A[], n){ for( last ← n downto 2 ){ A[1 ⋯ last] 중 가장 큰 수 A[k]를 찾는다; A[k] ↔︎ A[last]; } } 조금 더 구체화하면 아래와 같습니다. selectionSort(A[], n){ for( last ← n dow..
렌즈의 공식과 파이썬을 이용해 객체의 위치에 따른 상의 위치를 계산해보자. Lens equation 렌즈의 공식은 렌즈의 초점거리, 렌즈의 중심으로부터 피사체의 거리, 렌즈의 중심으로부터 상 사이의 거리사이의 관계를 나타낸다. 이를 이용해 렌즈의 특성으로 알 때 렌즈와 와 객체 사이의 거리를 계산해 상이 맺히는 곳을 계산 할 수 있다. Plotting graphs showing lens equation import numpy as np import matplotlib.pyplot as plt ## function # s' = Lens_Equation(s,f) # input # f: focal length # s: object location # output # s': image location def L..
스테판-볼츠만 법칙을 이용해 태양상수를 추정해보자. Stefan-Boltzman law 스테판-볼츠만 법칙은 단위면적당 방출되는 에너지의 총량과 흑체의 절대온도 사이의 관계식이다. 방출되는 복사 에너지는 절대온도의 네제곱에 비례한다. 이를 이용해 태양상수를 추정할 수 있다. Computing the solar constant at the Earth Computing the total energy emitting from the Sun and the Earth during 1 second. Assuming that the radius of the Sun and the Earth are about 675,000km and 6,400 km, respectively. Assuming that the distan..
빈의 변위 법칙을 이용해 지배적 파장을 계산해보자. Wien's displacement law 빈의 변위 법칙은 특정 절대온도의 흑체에서 방출되는 복사에너지가 가장 큰 파장을 계산하는 법칙이다. 이때 이 파장을 지배적인 파장이라고 부른다. 흑체에서 방출되는 파장 스펙트럼의 복사 에너지중 지배적 파장의 복사 에너지가 가장 크다. 지배적 파장은 흑체의 절대온도에 반비례한다. Wavelength of maximum energy Computing the wavelength of the maximum energy emission rate based on Wien’s displacement law and indicating the locations on the curves on previout post. # plo..
플랑크 흑체복사 법칙을 파이썬으로 그래프를 그려보자. Planck's blackbody radiation 입사하는 전자기파를 모두 흡수하는 이상적 물체를 흑체(blackbody)라 부른다. 흑체가 열평형상태에서 방출하는 복사에너지의 양은 플랑크 흑체 복사 법칙을 따른다. 플랑크 흑체복사 법칙은 흑체의 절대온도에 따른 방출되는 복사 에너지의 양을 방출되는 전자기파의 파장에 대한 함수로 나타낸다. 이를 이용하면 특정 절대온도의 흑체에서 파장에 따라 방출되는 복사에너지의 양을 계산 할 수 있다. Blackbody Radiation of Sun and Earth Plotting the two curves of spectral exitance as functions of the wavelength based on..