CS 인프런 워밍업 클럽 1주차 발자국

자료구조와 알고리즘

 

  1. 학생 정보를 저장할 자료구조
    저는 해시 테이블(Hash Table)를 선택하겠습니다.

    • 해시 테이블을 선택하는 경우, 학생의 학번이나 ID를 키(key)로 설정하면 빠르게 검색할 수 있습니다.

    • 해시 테이블은 검색 속도가 빠르지만 충돌 관리가 필요하고, 트리는 균형을 유지해야 하는 단점이 있습니다.

  2. 주문을 처리할 자료구조
    저는 큐(Queue) 를 선택하겠습니다.

    • 주문이 들어온 순서대로 처리되므로 FIFO(First-In, First-Out) 구조인 큐가 적절합니다.

    • enqueue() 연산으로 주문을 받고, dequeue() 연산으로 처리하면 효율적입니다.

    • JavaScript의 Array.push()Array.shift()를 활용해 간단하게 구현할 수 있습니다.

  3. 스택 구조 변경 (마지막 인덱스로 삽입 및 제거)
    기존 코드가 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;
        }
    }
    

     

  4. 이름을 이용한 해시 함수
    이름의 각 문자의 유니코드 값을 합산하여 해시값을 생성합니다.

    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으로 나누어 나머지를 사용하면 배열 크기에 맞게 적절한 인덱스가 생성됩니다.

 

운영체제

  1. 폴링 방식의 대안

    • 이벤트 기반(Event-Driven) 방식을 사용하면 성능을 최적화할 수 있습니다.

    • checkSkillActivated()를 주기적으로 확인하는 대신, 인터럽트(Interrupt) 또는 이벤트 리스너를 활용하면 필요할 때만 실행됩니다.

    • 예를 들어, 이벤트 리스너를 등록하여 플레이어가 스킬을 사용하면 즉시 감지할 수 있습니다.

    document.addEventListener("skillUsed", function() {
        console.log("스킬이 사용되었습니다!");
    });
    
    function useSkill() {
        let event = new Event("skillUsed");
        document.dispatchEvent(event);
    }
    
    useSkill(); // 스킬 사용 시 이벤트 발생
    
    • 게임 엔진에서는 콜백 함수 또는 인터럽트를 활용하여 특정 이벤트 발생 시에만 처리하도록 설계하는 것이 일반적입니다.


  1. 프로그램과 프로세스의 차이

    • 프로그램: 실행되지 않은 상태의 정적인 파일 (ex: .exe, .out 파일)

    • 프로세스: 실행 중인 프로그램 (CPU에서 작업을 수행하고 있는 개체)

    예를 들어, Chrome.exe 파일 자체는 프로그램, 실행 중인 크롬 브라우저는 프로세스입니다.


  1. 멀티프로그래밍과 멀티프로세싱의 차이

    • 멀티프로그래밍:

      • 여러 개의 프로그램을 메모리에 올려두고 CPU가 하나씩 실행

      • 한 프로그램이 I/O 작업을 수행하는 동안, CPU는 다른 프로그램을 실행

      • CPU 사용률을 높이지만 동시에 실행되는 것은 아님

    • 멀티프로세싱:

      • 여러 개의 CPU(Core)가 있어 여러 프로세스를 동시에 실행

      • 병렬 처리가 가능하여 성능 향상

      • 멀티코어 프로세서를 사용하는 현대 시스템에서 일반적으로 사용됨


  1. 운영체제가 프로세스를 관리하는 방식

    • 프로세스 스케줄러(Process Scheduler):

      • 프로세스의 상태를 관리하고 실행 순서를 결정하는 역할

    • PCB(Process Control Block):

      • 각 프로세스의 상태, 레지스터 값, 메모리 정보 등을 저장하는 자료구조

    • 스케줄링 알고리즘:

      • FCFS(선착순), SJF(최단 작업 우선), RR(라운드 로빈) 등 다양한 방식으로 프로세스를 관리


  1. 컨텍스트 스위칭(Context Switching)

    • CPU가 실행 중인 프로세스를 변경할 때 발생하는 과정

    • 실행 중인 프로세스의 레지스터, 프로그램 카운터(PC), 스택 정보 등을 PCB에 저장

    • 새로운 프로세스를 실행하기 위해 PCB에서 정보를 불러와 다시 복원

    • 문맥 전환이 자주 발생하면 오버헤드(비용)가 증가하여 성능이 저하될 수 있음

    예시:

    1. 프로세스 A 실행 중 → 인터럽트 발생 (I/O 요청)

    2. 프로세스 A의 상태 저장 (PCB에 보관)

    3. 프로세스 B 실행

    4. 프로세스 A의 I/O 완료 → PCB에서 복원 후 실행 재개

댓글을 작성해보세요.

채널톡 아이콘