안녕하세요
블로그
전체 192025. 06. 07.
0
인프런 워밍업 클럽 4기 CS - 2주차 발자국
학습 내용 요약 자료구조 & 알고리즘레드블랙 트리 우선순위 힙 우선순위 큐 컴퓨터 구조MUX디코더컨트롤 버퍼 반 가산기전 가산기ALU(산술논리연산장치)조합 논리회로 / 순차 논리회로SR 래치, D 래치, JK 래치 플립플롭레지스터RAM 회고 트리 자료구조가 끝나고 우선순위 큐까지 학습했으나 트리에 대한 이해도가 아직 부족하다고 느꼈습니다 여러 번 강의를 복습하고 직접 구현도 여러 번 해야 할 것 같습니다컴퓨터 구조의 경우 1주차에 비해 2주차에 학습할 내용이 많이 등장했으나 난이도 자체는 크게 어렵지 않아 무난하게 학습이 가능했습니다
2025. 06. 07.
1
인프런 워밍업 클럽 4기 CS - 2주차 자료구조와 알고리즘 미션
미션여러분은 간단한 운영체제를 개발하고 있습니다. 운영체제의 CPU 스케줄링을 구현해야 하는 차례입니다. 여러 프로세스들이 골고루 실행되도록 하기 위해, 프로세스 실행 횟수(executionCount)가 작은 프로세스의 우선순위를 높게 설정하는 CPU 스케줄링 정책을 만들려고 합니다. 또한, 모든 프로세스가 비슷하게 실행될 때는 사용자의 반응성을 높이기 위해 I/O Bound 프로세스들의 처리를 우선적으로 하려고 합니다. I/O Bound 프로세스는 CPU를 사용하다가 자발적으로 CPU를 반납(cpuReturnCount)하는 것으로 판단할 수 있습니다.따라서 다음 두 가지 조건으로 CPU 스케줄러를 구현해 보세요: 프로세스 실행 횟수가 가장 적은 프로세스가 우선순위가 높습니다.실행 횟수가 같을 경우, I/O Bound 프로세스가 우선순위가 높습니다.class Process{ constructor(name, cpuReturnCount, executionCount){ } } let cpuScheduler = new CpuScheduler(); cpuScheduler.enqueue(new Process("수치계산프로그램", 4, 0)); // cpu반납 4회, 실행횟수 0회 cpuScheduler.enqueue(new Process("뮤직플레이어", 11, 10)); // cpu반납 11회, 실행횟수 10회 cpuScheduler.enqueue(new Process("웹브라우저", 27, 25)); // cpu반납 27회, 실행횟수 25 cpuScheduler.enqueue(new Process("터미널1", 34, 2)); // cpu반납 34회, 실행횟수 2회 cpuScheduler.enqueue(new Process("터미널2", 93, 2)); // cpu반납 93회, 실행횟수 2회 console.log(cpuScheduler.dequeue()); // 수치계산프로그램 프로세스 출력 console.log(cpuScheduler.dequeue()); // 터미널2 프로세스 출력 console.log(cpuScheduler.dequeue()); // 터미널1 프로세스 출력 console.log(cpuScheduler.dequeue()); // 뮤직플레이어 프로세스 출력 console.log(cpuScheduler.dequeue()); // 웹브라우저 프로세스 출력답class Process { constructor(name, cpuReturnCount, executionCount) { this.name = name; this.cpuReturnCount = cpuReturnCount; this.executionCount = executionCount; } } import { Heap } from "./heap.mjs"; class CpuScheduler { constructor() { this.heap = new Heap(); this.heap.isBigPriority = function(first, second) { if (first.executionCount !== second.executionCount) { return first.executionCount second.cpuReturnCount; }; } enqueue(process) { this.heap.insert(process); } dequeue() { let removedNode = this.heap.remove(); return removedNode ? removedNode.getData() : null; } } let cpuScheduler = new CpuScheduler(); cpuScheduler.enqueue(new Process("수치계산프로그램", 4, 0)); cpuScheduler.enqueue(new Process("뮤직플레이어", 11, 10)); cpuScheduler.enqueue(new Process("웹브라우저", 27, 25)); cpuScheduler.enqueue(new Process("터미널1", 34, 2)); cpuScheduler.enqueue(new Process("터미널2", 93, 2)); console.log(cpuScheduler.dequeue()); // 수치계산프로그램 console.log(cpuScheduler.dequeue()); // 터미널2 console.log(cpuScheduler.dequeue()); // 터미널1 console.log(cpuScheduler.dequeue()); // 뮤직플레이어 console.log(cpuScheduler.dequeue()); // 웹브라우저
2025. 06. 07.
0
인프런 워밍업 클럽 4기 CS - 2주차 컴퓨터 구조 미션
미션 1다음 파일의 모든 연결을 터널로 대체해보세요.(회로 이미지와 .circ파일 첨부) 미션 28비트 32입력 MUX를 제작해보세요.(회로 이미지와 .circ파일 첨부)미션 310비트 입력 두 개(A, B)를 계산하는 ALU 만들어보세요.(회로 이미지와 .circ파일 첨부) 미션 432비트 RAM을 만들어보세요. 디코더와 MUX는 logisim 기본 내장된 걸 사용해도 좋습니다.(회로 이미지와 .circ파일 첨부)파일 공유 링크
2025. 06. 01.
0
인프런 워밍업 클럽 4기 CS - 1주차 컴퓨터 구조 미션
미션 1문제4입력 AND, OR, NAND, NOR, XOR 연산의 진리표를 작성해보세요.답 미션 2문제다음 불 방정식들을 여러 방법을 이용해 간략화 해보세요.,1. A( (BB)’+ 0A) + (CC)' = (AB’) +C 2. (B’B’) + (AD’ + (CA)’)D = B’ + (DC’) + (DA’) 3. (A’B) + B(B1 + BC) = B 4. B’(1C + BD) + DB = (B’C) + (DB) 답AB' + C' = AB' + C B' + AD' + CD' = B' + AD' + CD' B = B B'C + DB = B'C + DB 미션 3문제다음 2진수를 10진수로 변환해보세요.1. 110111 = 2. 10000001 = 3. 11111100000 = 4. 101010 = 답1. 55 2. 129 3. 2106 4. 42 미션 4문제다음 10진수를 2진수로 변환해보세요.1. 10 = 2. 27 = 3. 86 = 4. 516 = 답1. 1010 2. 11011 3. 1010110 4. 1000000100 미션 5문제다음 불 방정식을 logisim을 이용해 회로를 만들어보세요.(회로 이미지와 .circ파일 첨부) (B’C) + (DB)(AB’) + CB’ + (DC’) + (DA’)파일 공유 링크
2025. 06. 01.
1
인프런 워밍업 클럽 4기 CS - 1주차 자료구조와 알고리즘 미션
미션Python, JavaScript, C# 같은 언어는 가비지 컬렉터를 이용해 메모리를 자동으로 정리하는 매니지드 언어(Managed Language)에 속합니다. 매니지드 언어의 가비지 컬렉터는 개발자가 메모리를 요청하면 운영체제의 힙 영역에 할당하고, 더 이상 필요하지 않을 때 자동으로 해제하며 메모리를 관리합니다.여러분이 속한 회사에서 새로운 매니지드 언어를 개발 중이며, 여러분은 가비지 컬렉터 개발을 담당하게 되었습니다. 특히 메모리 검색 부분을 맡게 되었는데, 사용자가 특정 크기(Byte)의 메모리를 요청하면 사용 가능한 메모리 중 가장 적절한 크기를 찾아 반환하는 GarbageCollector 클래스를 구현해보세요.(같은 크기의 메모리는 없다고 가정) 답import { AVLTree } from "./avlTree.mjs" class GarbageCollector { constructor() { this.memoryTree = new AVLTree(); } insertFreeMemory(size) { this.memoryTree.insert(this.memoryTree.root, size); } searchFreeMemory(requestedSize) { return this.findBestFit(this.memoryTree.root, requestedSize); } findBestFit(node, requestedSize, target = null) { if (node == null) { return target; } if (node.getData() === requestedSize) { return node; } if (node.getData() >= requestedSize) { if (target == null || node.getData()
2025. 06. 01.
1
인프런 워밍업 클럽 4기 CS - 1주차 발자국
학습 내용 요약 자료구조 & 알고리즘P-NP 문제트리계층구조를 표현하기에 적합이진 트리각각의 노드가 최대 2개의 자식 노드를 가질 수 있는 트리성능조회 - O(n) / O(logn)종류완전이진트리포화이진트리AVL 트리스스로 균형을 잡는 이진 트리회전RR 회전LL 회전RL 회전LR 회전 컴퓨터 구조컴퓨터 구성 요소CPU메모리주변 장치비트불 대수연산성질과 법칙교환법칙결합법칙분배법칙흡수법칙드모르간의 법칙불 함수카르노 맵비트10진법, 2진법, 16진법빅 라디안, 리틀 라디안 LSB, MSB오버플로우, 인터럽트음수2의 보수 + 1로 치환 뺄셈을 덧셈으로 편리하게 연산 가능 logisim-evolution 사용법 후기컴퓨터 구조의 경우 초반이라 그런지 강의 내용도 간단했고 실습도 간단해서 편하게 볼 수 있었습니다컴퓨터 구조의 미션도 크게 어렵지 않았습니다 자료구조 & 알고리즘의 경우 심화편이라서 그런지 초반 내용부터 꽤 시간이 필요했습니다 미션 제출 이후에도 추가적인 복습이 필요하다는 것을 느꼈습니다
2025. 03. 22.
0
인프런 워밍업 클럽 3기 CS - 3주차 발자국
해당 글은 감자님의 강의인 그림으로 쉽게 배우는 운영체제, 그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)을 수강하고 적은 글입니다. 학습 내용운영체제입출력 장치주변 장치메인보드 내 버스로 연결입출력 제어기를 통해 여러 주변 장치 처리마우스 / 키보드사용자 이벤트 발생 -> 디바이스 컨트롤러에서 이벤트 감지 -> 디바이스 컨트롤러가 CPU에 인터럽트 신호 전달 -> 드라이버가 운영체제에게 이벤트 전달 -> 운영체제가 포그라운드 애플리케이션에게 이벤트 전달파일 / 디스크하나의 파일은 여러 블록으로 이루어짐연속 할당불연속 할당 자료구조와 알고리즘동적 프로그래밍메모이제이션하향식, 재귀타뷸레이션상향식, 반복문 회고 부족한 지식을 그림과 상황극을 통해 이해할 수 있어 좋았습니다.학습한 내용을 바탕으로 꾸준히 복습하면서 연관된 더 깊은 내용을 학습해야 할 것이라는걸 알게 되었습니다.
2025. 03. 22.
0
인프런 워밍업 클럽 3기 CS - [3주차] 운영체제 미션
1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터가장 빠른 기억 장소입니다.CPU 내에 위치합니다.휘발성 메모리입니다.캐시레지스터와 메인 메모리 사이에 위치해 있습니다.매우 빠른 레지스터와 매우 느린 메인 메모리 사이의 속도를 절충하기 위한 목적을 가지고 있습니다.메인 메모리운영체제와 프로세스가 적재되는 메모리입니다.휘발성 메모리입니다.보조저장장치비휘발성 메모리입니다.가격이 저렴합니다.2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식내부 단편화가 발생하지 않습니다.외부 단편화가 발생합니다.고정 분할 방식외부 단편화가 발생하지 않습니다.내부 단편화가 발생합니다.4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.폰 노이만 구조는 CPU와 메모리가 필수 사항이기 때문에 HDD나 SSD같은 보조저장장치는 컴퓨터를 실행시키는데 반드시 필요한 것은 아닙니다.다만 컴퓨터 부팅 과정 중 하드디스크에 있는 마스터 부트 레코드에 저장된 부트로더를 메모리로 가져와서 실행하며, 운영체제 또한 대부분 HDD나 SSD에 저장되므로 폰 노이만 구조로만 따진다면 반드시 필요하지는 않지만 사실상 필수적이라고 생각합니다.6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일 시스템은 파일을 삭제할 때 파일 데이터 전체를 삭제하는 것이 아닌, 파일의 헤더만 삭제하기 때문입니다.파일 헤더를 삭제한 파일 블록은 free block list에 저장되므로 복구가 가능합니다.
2025. 03. 22.
0
인프런 워밍업 클럽 3기 CS - [3주차] 자료구조와 알고리즘 미션
1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬 : O(n²)선택 정렬 : O(n²)삽입 정렬 : O(n²)병합 정렬 : O(n log n)퀵 정렬 : Θ(n log n) / 최악 케이스: O(n²)2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.메모리가 부족한 상황이라면 재귀로 쉽게 구현이 가능하지만 타뷸레이션으로 구현할 것 같습니다.메모이제이션은 재귀를 사용하기 때문에 콜 스택에 함수 프레임이 쌓이게 되며, 함수의 계산 결과 또한 별도의 메모리 공간에 저장하기 때문에 메모리가 빠르게 부족해질 수 있을 것이라고 판단했기 때문입니다.타뷸레이션도 함수의 계산 결과를 별도의 메모리 공간에 저장하기는 하지만 메모이제이션에 비해서는 메모리를 덜 사용한다고 생각합니다.만약 해당 알고리즘을 구현을 한다면 메모이제이션으로 우선 구현한 뒤, 타뷸레이션으로 리팩터링 하는 식으로 구현할 것 같습니다.
2025. 03. 15.
0
인프런 워밍업 클럽 3기 CS - [2주차] 자료구조와 알고리즘 미션
1번 문제질문재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?답번가저조건을 만들지 않는다면 자기 자신을 무한히 호출하게 되므로 콜스택이 가득 차 StackOverflow 문제가 발생합니다.기저조건을 잘못 설정했다면 기저조건을 만들지 않았을 때와 동일하거나 원하는 결과를 얻지 못하게 됩니다.2번 문제질문0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function sumOdd(n){ // 재귀 로직 } console.log(sumOdd(10)) // 25 답변function sumOdd(n){ if (n == 1) { return 1; } if (n % 2 == 0) { return sumOdd(n - 1); } else { return sumOdd(n - 1) + n; } } 3번 문제질문다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다. 다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.const fs = require("fs"); // 파일을 이용하는 모듈 const path = require("path"); // 폴더와 파일의 경로를 지정해주는 모듈 function traverseDirectory1(directory){ const stack = [directory]; // 순회해야 할 디렉토리를 저장할 스택 while (stack.length > 0) { // 스택이 빌 때까지 반복 const currentDir = stack.pop(); // 현재 디렉토리 const files = fs.readdirSync(currentDir); // 인자로 주어진 경로의 디렉토리에 있는 파일or디렉토리들 for (const file of files) { // 현재 디렉토리의 모든 파일or디렉토리 순회 const filePath = path.join(currentDir, file); //directory와 file을 하나의 경로로 합쳐줌 const fileStatus= fs.statSync(filePath); // 파일정보 얻기 if (fileStatus.isDirectory()) { // 해당 파일이 디렉토리라면 console.log('디렉토리:', filePath); stack.push(filePath); } else { // 해당 파일이 파일이라면 console.log('파일:', filePath); } } } } traverseDirectory1("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력 답변function traverseDirectory(directory) { const files = fs.readdirSync(directory); for (const file of files) { const filePath = path.join(directory, file); const fileStatus = fs.statSync(filePath); if (fileStatus.isDirectory()) { console.log('디렉토리:', filePath); traverseDirectory(filePath); } else { console.log('파일:', filePath); } } } traverseDirectory(".");