🎁[속보] 인프런 내 깜짝 선물 출현 중🎁

[인프런 워밍업 클럽 3기] CS - 1주차 미션

[인프런 워밍업 클럽 3기] CS - 1주차 미션

1주차 미션


운영체제

    while(true){
      wait(1); // 1초 멈춤
      bool isActivated = checkSkillActivated(); // 체크
    }

  1. 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식 입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?

    • 폴링 방식을 사용하게 되면 CPU가 주기적으로 이벤트 발생 여부를 확인하는데 불필요한 연산 때문에 성능이 좋지 않고 , 계속 이벤트 체크를 해주어야 하기 때문에 자원이 낭비되는 문제가 발생함.

    • 이를 위해 인터럽트 방식을 사용해야 한다.

    • 인터럽트 방식은 이벤트가 발생했을 때 , 서비스 루틴(ISR)을 실행하여 이벤트를 처리하고 ISR은 비동기적으로 동작해 성능이 좋음.

       


  2. 프로그램과 프로세스가 어떻게 다른가요?

    • 프로그램 : 저장 장치에 저장된 명령문의 집합체 (파일 , 코드)를 뜻함

    • 프로세스 : 메모리에 올라가 실행중인 프로그램을 의미

       


  3. 멀티 프로그래밍과 멀티 프로세싱이 어떻게 다른가요?

    • 멀티 프로그래밍 : 메모리에 여러 프로세스가 올라온 형태

    • 멀티 프로세싱 : CPU 여러 개를 사용해 여러 작업을 동시에 처리하는 방식

    • 멀티 프로그래밍은 동시에 실행하는것 처럼 시분할 방식을 가지고 , 멀티 프로세싱은 병렬처리가 이루어져 여러 프로그램을 동시에 실행함.

       


  4. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?

    • PCB를 사용. 프로세스가 만들어지면 운영체제는 프로세스 정보를 가지고 있는 PCB를 생성. PCB 는 서로 연결되어 있는 연결 리스트 형태를 가지고 프로세스를 효율적으로 관리함.


  5. 컨텍스트 스위칭이란 뭔가요?

    • CPU가 실행 중인 프로세스를 변경할 때 , 현재 실행중인 프로세스의 상태를 저장하고 , 다른 프로세스의 상태값으로 교체.

    • 컨텍스트 스위칭이 일어날 때 PCB의 내용이 변경되며 , 컨텍스트 스위칭이 자주 일어나는 환경에서는 오버헤드가 발생할 가능성이 있음.


자료구조 & 알고리즘

  1. 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.

    이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.

    • 해시맵을 사용하여 빠르게 검색하고 중복을 피하기 위해 키-값 저장을 할 수 있는 해시맵을 사용할 것같습니다. 학생의 고유 값인 학번 이나 이름을 키로 사용해 빠르게 검색하는 부분에 효율적으로 저장/관리 할 것 같습니다.


  2. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.

    • 주문이 들어온 순서라면 큐를 사용하여 먼저 들어온 주문을 먼저 처리(FIFO) 선입선출 방식으로 처리하고 데이터의 삽입 삭제가 O(1)로 효율적인 처리가 가능하기 때문입니다.


  3. 우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다. 반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요.

     

    public class Stack {
        private final int[] stack; // 스택 배열 생성
        private final int capacity;
        private int size;
    
        public Stack(int capacity) {
            this.capacity = capacity;
            this.stack = new int[capacity];
            this.size = 0;
        }
    
        public static void main(String[] args) {
            Stack stack = new Stack(3);
    
            stack.push(1);
            stack.push(2);
            stack.push(3);
    
            stack.push(4); // 스택의 사이즈가 0일 경우 -1 return
    
            System.out.println(stack.peek()); // 제일 스택 위에 있는 값 3
    
            System.out.println(stack.pop()); // 3
            System.out.println(stack.pop()); // 2
            System.out.println(stack.pop()); // 1
    
            System.out.println(stack.pop()); // -1
        }
    
        // 스택이 비었는지 검증
        public boolean isEmpty() {
            return size == 0;
        }
    
        // 스택이 가득 차있는지 검증
        public boolean isFull() {
            return size == capacity;
        }
    
        // 데이터 삽입 (출구 쪽에 삽입)
        public void push(int data) {
            if (isFull()) { // 가득 차있을경우는 스택에 값을 삽입하지 않음.
                return;
            }
            // 마지막 인덱스에 삽입
            stack[size] = data;
    
            size++;
        }
    
        // 데이터 삭제 (출구 쪽에서 삭제)
        public int pop() {
            if (isEmpty()) { // 스택에 값이 없을경우 -1 return
                return -1;
            }
            // 마지막 인덱스의 데이터 반환 후 크기 감소
            int poppedValue = stack[size - 1];
    
            size--;
            return poppedValue;
        }
    
        // 스택 가장 위의 값
        public int peek() {
            if (isEmpty()) { // 스택이 비었을 때 검증
                return -1;
            }
    
            return stack[size - 1];
        }
    }

  4. 해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요.

(힌트: charCodeAt() 함수를 이용 예시: name1 = "이운재"; name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력)

hashFunction(name){
	let hashValue = 0;
        for (let i = 0; i < name.length; i++) {
            hashValue += name.charCodeAt(i); // 각 문자의 유니코드 값 더함
        }
        return hashValue % 10; 
}

댓글을 작성해보세요.


채널톡 아이콘