목록Computer Science (29)
without haste but without rest
운영체제는 시스템 자원을 관리한다. 하드웨어는 스스로 작동할 수 없다. 즉 하드웨어 자원을 관리할 소프트웨어가 필요하다. 해당 역할을 하는 게 운영체제다. 운영체제는 특정 프로그램이 CPU를 얼마나 사용할지 그리고 각 프로그램을 Memory의 어느 주소에 저장할지와 같은 하드웨어 자원의 사용률을 관리한다. 운영체제와 응용프로그램간의 관계 어플리케이션 관리 시스템 자원 관리 사용자와 컴퓨터간의 커뮤니케이션 지원 운영체제의 목표 사용자가 사용하는 프로그램이 효율적으로 적절하게 동작하도록 지원한다. 즉 운영체제는 응용 프로그램이 요청하는 시스템 리소스를 효율적으로 분배하고 지원하는 소프트웨어다.
Reference - https://plas.tistory.com/129 진짜 이차원배열처럼 malloc하는 방법 이차원배열을 어떻게 malloc하느냐는 질문을 받았는데, 쉽지 않은 주제네요. 이차원 배열을 함수 매개변수로 넘기는 방법을 먼저 살펴보겠습니다. C 언어에서 2차원 배열은 포인터의 배열이고 각 포인터는 COLS칸.. plas.tistory.com #include #include int main(void) { /* 진짜 2차원 배열처럼 구현하기 1. 배열 선언 (5 x 3 배열) 2. 헤드 포인터 선언 3. 헤드 포인터 연결 4. 데이터 입력 5. 데이터 출력 */ int count = 0, i, j; int r = 5, c = 3; int len = sizeof(int*) * r + size..
C 로 그래프를 구현하는 중에 이해를 못하는 상황이 발생했다. 파이썬은 딕셔너리 구조를 이용해서 정말 쉽게 구현했고, 메모리 관리를 따로 안 해줘도 되니까 구조 자체에만 집중할 수 있었다. 온라인 강의를 보면서 굉장히 비효율적인 공부를 하다가, 혼자 그래프를 그려보고 직접 생각하면서 이를 코드로 구현하는 게 역시나 정석인 것 같다고 판단했다. 결론: 노트에 구조를 그려보고, 여기에 맞춰서 코드를 짜는 게 오래 남는다. 코드로 그래프를 구현한다는 것은 사람이 눈으로 인식하는 것과는 차이가 있다. 그래프 구조의 특징은 노드가 가지는 숫자가 노드의 개수보다 크지 않고, 중간에 비는 숫자가 없다. (만약 노드가 갖는 숫자가 1부터 순차적인 숫자가 아니라 중간에 훅 건너 뛰는 경우는 배열의 크기를 늘리는 방법을 ..
Reference - https://apophis0.tistory.com/48 나는 리눅스 사용환경이 VM이라 새로 설정하는 일이 자주 생긴다. 항상 VDI, VHD, VMDK 설정의 차이점이 무엇일까 궁금하던 참에 괜찮게 정리한 자료가 있어서 참고해서 요약한다. VDI (Vitural Disk Image) Oracle VM에서만 사용가능한 포맷 VHD (Virtual Hard Disk) Oracle VM, MS의 Hyper-V, 시트릭스의 Xen에서 구동가능한 포맷 VMDK (Virtual Machine Disk) Oracle VM, VMware 에서 구동가능한 포맷
너비 우선 탐색(BFS) (레이아웃이 PC 에 최적화 되어있습니다.) BFS 알고리즘은 탐색하는 노드가 속한 레벨을 전부 탐색하고 다음 레벨로 넘어간다. 즉 형제 노드를 전부 탐색하고 자식노드로 내려간다. DFS의 경우 큐와 스택 두가지를 활용했는데, BFS는 큐로 구현한다. 위 그래프를 딕셔너리 형태로 표현하면 다음과 같다. graph = dict() graph[0] = [1, 2] graph[1] = [0, 3, 4] graph[2] = [0, 5, 6] graph[3] = [1] graph[4] = [1] graph[5] = [2] graph[6] = [2] res는 최종적으로 반환할 리스트이며 visit은 탐색할 노드들이 담길 리스트다. 가장 먼저 시작 노드인 0이 res 리스트에 추가된다. 다음..
깊이 우선 탐색(DFS) (레이아웃이 PC 에 최적화 되어있습니다.) 깊이 우선 탐색 알고리즘은 말 그대로 깊이를 우선순위로 두고 탐색한다. 위 이미지에서 우측의 DFS 알고리즘은 0 → 1 → 3 → 4 → 2 → 5 → 6 순서로 탐색을 한다. (이때 0에서 1, 2로 가는 순서는 상관 없다. 따라서 0 → 2 → 6 → 5 → 1 → 4 → 3으로도 탐색할 수 있다.) 위 그래프 구조를 파이썬 딕셔너리 형태로 표현하면 아래와 같다. graph = dict() graph[0] = [1, 2] graph[1] = [0, 3, 4] graph[2] = [0, 5, 6] graph[3] = [1] graph[4] = [1] graph[5] = [2] graph[6] = [2] 0에서 1로 움직이고 1에서는..
병합 정렬(Merge Sort) 병합 정렬은 배열을 좌, 우로 나누고, 나눈 배열을 정렬하고 다시 붙인다. 이 과정을 반복한다. 퀵 소트와 마찬가지로 재귀 용법을 활용하는 알고리즘이다. 위키피디아에서 제공하는 이미지가 더 도움이되는 것 같다. 아래 코드 과정을 일일히 손으로 써보면 위와 같은 구조로 진행됨을 확인할 수 있다. (*재귀를 정확히 이해해야 코드를 이해할 수 있다.) [python] 알고리즘 - 재귀 용법(Recursive Call) 재귀 용법(Recursive Call) 이미지를 보면 프로그램 속에서 프로그램을 실행했다. 다시 프로그램 속의 프로그램 속에서 프로그램을 실행했다. 이게 재귀다. 함수 안에서 다시 똑같은 함수를 불러와서 재사용한다... jinyes-tistory.tistory.c..
재귀 용법(Recursive Call) 이미지를 보면 프로그램 속에서 프로그램을 실행했다. 다시 프로그램 속의 프로그램 속에서 프로그램을 실행했다. 이게 재귀다. 함수 안에서 다시 똑같은 함수를 불러와서 재사용한다. *주의할 점은 항상 종료 조건을 만들어줘야 한다. 무한 루프에 빠진다. # Recursive def recursive(data): if data == 0: return print(data) recursive(data -1) print('Number is ', data) #Test Code recursive(5) 위 코드를 실행하면 아래처럼 출력된다. Number is .. 가 왜 역순으로 출력이 되는지 생각해보면 재귀를 이해하는 데에 도움이 된다.