본문 바로가기

CS Study

(29)
[자료구조] 메모리 구조 1. 코딩 실행 파일 동작 방식 1) 개발을 할 때 C, C++, Java 등의 언어들을 이용하여 코딩을 하고 실행파일로 만든다.(ex. .exe 파일 등 ) 2) 이러한 실행파일을 사용자는 클릭을 하는 등의 방법으로 실행한다. 3) 메모리에 로드되면서 코드에서 작성한 동작에 따라 메모리에 데이터들을 쓰고 읽게되는데 이는 운영체제가 해준다. 운영체제가 프로그램의 정보들을 읽고 메인 메모리에 공간을 할당해주고, 프로그램의 코드(변수, 함수 등)을 메모리에 읽고 쓰면서 동작을 하게 된다. 2. 메모리 구조 낮은 주소를 갖는 순서대로 나열하였다. [TEXT] 코드를 실행하기 위해 저장되어있는 영역이다. 흔히 코드 영역이라고 하는데 프로그램을 실행시키기 위해 구성되는 것들이 저장되는 영역이다. 명령문들이 저장된..
[Algorithm] 자료형의 크기 1. 정보 단위 1) 비트 컴퓨터가 이해하는 가장 작은 정보 단위로 0과 1을 나타낸다. 1비트는 0과 1, 두 가지 정보를 표현할 수 있다. 2) 바이트 8개의 비트가 묶인 단위이다. 표현할 수 있는 정보량은 2^8 (256)개이다. - 킬로바이트 (KB): 1바이트를 1,000개 묶은 단위 - 메가바이트 (MB): 1킬로바이트를 1,000개 묶은 단위 - 기가바이트 (GB): 1메가바이트를 1,000개 묶은 단위 - 테라바이트 (TB): 1기가바이트를 1,000개 묶은 단위 2. C/C++, JAVA에서 자료형 종류에 따른 범위 자료형 자료형의 크기 자료형의 범위 char, signed char 1바이트 = 8비트 -128 ~ 127 unsigned char 1바이트 = 8비트 0 ~ 255 shor..
[Algorithm] 완전 탐색 1. 완전 탐색 알고리즘이란? 가능한 모든 경우의 수를 다 체크해서 정답을 찾는 방법이다. Brute Force라고도 부르며, 직관적이어서 이해하기 쉽고 문제의 정확한 값을 얻어낼 수 있는 확실하고, 기초적인 방법이다. 완전 탐색을 이용할 때는 두가지를 고려해야한다. 1. 사용된 알고리즘이 적절한가? 2. 효율적으로 동작하는가? 1번은 만족하나 2번의 경우 제한이 따르는 경우가 많으니, 완전 탐색을 이용할 경우에는 문제에 대한 파악이 중요하다. 2. 완전 탐색 기법의 활용 완전 탐색 기법을 이용하기 위해서는 여러 알고리즘 기법이 이용된다. (완전 탐색 자체를 알고리즘으로 볼 수는 없다.) - 단순 Brute-Force 단순하게 for문과 if문 등으로 모든 case들을 만들어서 답을 구하는 방법이다. (..
[Algorithm] 다이나믹 프로그래밍 1. 다이나믹 프로그래밍이란? 메모리 공간을 약간 더 사용하면 연산 속도를 비약적으로 증가시킬 수 있는 방법이다. 이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 한다. 구현은 일반적으로 탑다운, 보텀업 이 두가지 방식으로 구성된다. 주의) 자료구조에서 dynamic allocation(동적 할당)과 무관한 의미로 사용됨. 어떤 경우 필요할까? 가장 대표적인 예시로 피보나치 수열이 있다. 피보나치 수열의 점화식은 아래와 같다. n번째 피보나치 수는 (n-1)번째 피보나치 수 + (n-2)번째 피보나치 수이며, 1번째와 2번째 피보나치수는 1임을 뜻한다. n번째 피보나치 수를 f(n)이라고 할 때 4번째 피보나치 수 f(4)를 구하는 과정은 다음과 같다. 코드 구현) d..
[Algorithm] Tree, Map 자료구조 1. Tree란? 가계도와 같은 계층적은 구조를 표현할 때 사용할 수 있는 자료구조이다. 용어 정리) 루트 노드: 부모가 없는 최상위 노드 단말 노드: 자식이 없는 노드 크기: 트리에 포함된 모든 노드의 개수 깊이: 루트 노드부터의 거리 높이: 깊이 중 최댓값 차수: 각 노드의 간선 개수 (자식이 몇개인지) 기본적으로 트리의 크기가 N일 때, 전체 간선의 개수는 N-1개이다. 구현) 파이썬 코드 class Node: def __init__(self, data, left_node, right_node): self.data=data self.left_node=left_node self.right_node=right_node n = int(input()) tree = {} for i in range(10):..
[Algorithm] 정렬 1. 정렬 알고리즘이란? 데이터를 특정한 기준에 따라서 순서대로 나열하는 것을 말한다. (정렬 알고리즘은 이진 탐색의 전처리 과정이기도하니 제대로 알고 넘어가자.) 파이썬에서는 내림차순 리스트를 제공하고, 이는 O(N) 복잡도로 수행가능하니, 오름차순만 우선 공부해보자. 2. 선택 정렬 선택정렬의 아이디어는 매번 ' 가장 작은 것을 선택한다. ' 이다. 데이터가 무작위로 여러 개 있을 때, 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸고, 그 다음 작은 데이터를 선택해 앞에서 두 번째 데이터와 바꾸는 과정을 반복한다. 가장 작은 데이터를 N - 1번 반복하면 정렬이 완료되는 것을 알 수 있다. array = [7,5,9,0,3,1,6,2,4,8] for i in range(len(array)):..
[Algorithm] 공간 복잡도 1. 공간 복잡도란? 프로그램을 실행시킨 후 완료하는데 필요로 하는 자원 공간의 양을 말한다. 공간의 복잡도를 결정하는 것으로 보통 배열의 크기가 몇인지, 얼마 만큼의 동적 할당인지, 몇 번의 호출을 하는 재귀함수 인지 등이 있다. 총 공간요구 = 고정 공간 요구 + 가변 공간 요구로 나타낼 수 있다. 2. 고정 공간, 가변 공간 고정 공간은 입력과 출력의 횟수나 크기에 관계없는 공간의 요구를 말한다. ex) 코드 저장 공간, 단순 변수, 변수, 상수 저장 가변 공간은 프로그램 실행 중에 요구되는 요소이다. ex) 배열 전달, 재귀 호출, 회귀 주소 함수 호출시에 할당되는 지역 변수들이나 동적 할당되는 객체들도 모두 공간이 필요한데, 특히 재귀함수의 경우 매 함수 호출마다 매개변수, 지역변수, 함수의 복..
[Algorithm] 시간 복잡도 1. 시간복잡도란? 간단한 정의는 알고리즘의 성능을 설명하는 것이다. 이를 위해 알고리즘을 수행하기 위해 프로세스가 수행해야하는 연산을 수치화한 것이라고 생각하면 된다. 이 시간복잡도는 주로 빅-오 표기법을 사용해 나타낸다. 2. 빅오 표기법 시간 복잡도는 빅-오(Big-O), 빅-오메가(Big-Ω), 빅-세타(Big-θ) 방법으로 표기한다. 위 세가지 표기법은 각가 최악, 최선, 중간의 경우에 대하여 나타내는 방법이다. 연산 횟수가 다항식으로 표현될 경우, 최고차항을 제외한 모든 항과 최고차항의 계수를 제외시켜 나타낸다. 이 중에서도 빅오 표기법이 가장 자주 사용된다. " 이 정도 시간까지 걸릴 수 있다." 를 고려해야 그에 맞는 대응이 가능하기 때문이다. 3. 빅오 표기법의 종류 복잡도 1 10 10..