CS 인프런 워밍업 클럽 1주차 발자국
자료구조와 알고리즘
학생 정보를 저장할 자료구조
저는 해시 테이블(Hash Table)를 선택하겠습니다.해시 테이블을 선택하는 경우, 학생의 학번이나 ID를 키(key)로 설정하면 빠르게 검색할 수 있습니다.
해시 테이블은 검색 속도가 빠르지만 충돌 관리가 필요하고, 트리는 균형을 유지해야 하는 단점이 있습니다.
주문을 처리할 자료구조
저는 큐(Queue) 를 선택하겠습니다.주문이 들어온 순서대로 처리되므로 FIFO(First-In, First-Out) 구조인 큐가 적절합니다.
enqueue()
연산으로 주문을 받고,dequeue()
연산으로 처리하면 효율적입니다.JavaScript의
Array.push()
와Array.shift()
를 활용해 간단하게 구현할 수 있습니다.
스택 구조 변경 (마지막 인덱스로 삽입 및 제거)
기존 코드가unshift()
와shift()
를 이용하여 0번 인덱스에서 데이터를 삽입/삭제했다면,
이를push()
와pop()
으로 변경하여 마지막 인덱스에서 처리하도록 수정합니다.class Stack { constructor() { this.items = []; } push(element) { this.items.push(element); // 마지막 인덱스에 추가 } pop() { if (this.isEmpty()) { return "Stack is empty"; } return this.items.pop(); // 마지막 인덱스에서 제거 } peek() { return this.items[this.items.length - 1]; // 마지막 요소 반환 } isEmpty() { return this.items.length === 0; } size() { return this.items.length; } }
이름을 이용한 해시 함수
이름의 각 문자의 유니코드 값을 합산하여 해시값을 생성합니다.function hashFunction(name) { let hash = 0; for (let i = 0; i < name.length; i++) { hash += name.charCodeAt(i); // 각 문자의 유니코드 값을 더함 } return hash % 100; // 적절한 범위로 나눠줌 (예: 0~99) } console.log(hashFunction("이운재")); // 예시 출력 console.log(hashFunction("홍길동")); // 예시 출력
charCodeAt()
을 사용하여 각 문자(한글 포함)의 유니코드 값을 가져와 더합니다.이렇게 하면 이름이 유사하더라도 해시값이 골고루 분포되도록 도울 수 있습니다.
100
으로 나누어 나머지를 사용하면 배열 크기에 맞게 적절한 인덱스가 생성됩니다.
운영체제
폴링 방식의 대안
이벤트 기반(Event-Driven) 방식을 사용하면 성능을 최적화할 수 있습니다.
checkSkillActivated()
를 주기적으로 확인하는 대신, 인터럽트(Interrupt) 또는 이벤트 리스너를 활용하면 필요할 때만 실행됩니다.예를 들어, 이벤트 리스너를 등록하여 플레이어가 스킬을 사용하면 즉시 감지할 수 있습니다.
document.addEventListener("skillUsed", function() { console.log("스킬이 사용되었습니다!"); }); function useSkill() { let event = new Event("skillUsed"); document.dispatchEvent(event); } useSkill(); // 스킬 사용 시 이벤트 발생
게임 엔진에서는 콜백 함수 또는 인터럽트를 활용하여 특정 이벤트 발생 시에만 처리하도록 설계하는 것이 일반적입니다.
프로그램과 프로세스의 차이
프로그램: 실행되지 않은 상태의 정적인 파일 (ex:
.exe
,.out
파일)프로세스: 실행 중인 프로그램 (CPU에서 작업을 수행하고 있는 개체)
예를 들어,
Chrome.exe
파일 자체는 프로그램, 실행 중인 크롬 브라우저는 프로세스입니다.
멀티프로그래밍과 멀티프로세싱의 차이
멀티프로그래밍:
여러 개의 프로그램을 메모리에 올려두고 CPU가 하나씩 실행
한 프로그램이 I/O 작업을 수행하는 동안, CPU는 다른 프로그램을 실행
CPU 사용률을 높이지만 동시에 실행되는 것은 아님
멀티프로세싱:
여러 개의 CPU(Core)가 있어 여러 프로세스를 동시에 실행
병렬 처리가 가능하여 성능 향상
멀티코어 프로세서를 사용하는 현대 시스템에서 일반적으로 사용됨
운영체제가 프로세스를 관리하는 방식
프로세스 스케줄러(Process Scheduler):
프로세스의 상태를 관리하고 실행 순서를 결정하는 역할
PCB(Process Control Block):
각 프로세스의 상태, 레지스터 값, 메모리 정보 등을 저장하는 자료구조
스케줄링 알고리즘:
FCFS(선착순), SJF(최단 작업 우선), RR(라운드 로빈) 등 다양한 방식으로 프로세스를 관리
컨텍스트 스위칭(Context Switching)
CPU가 실행 중인 프로세스를 변경할 때 발생하는 과정
실행 중인 프로세스의 레지스터, 프로그램 카운터(PC), 스택 정보 등을 PCB에 저장
새로운 프로세스를 실행하기 위해 PCB에서 정보를 불러와 다시 복원
문맥 전환이 자주 발생하면 오버헤드(비용)가 증가하여 성능이 저하될 수 있음
예시:
프로세스 A 실행 중 → 인터럽트 발생 (I/O 요청)
프로세스 A의 상태 저장 (PCB에 보관)
프로세스 B 실행
프로세스 A의 I/O 완료 → PCB에서 복원 후 실행 재개
댓글을 작성해보세요.