분류 전체보기 203

[운영체제] 병행 프로세스 - 세마포어 완벽 정리 Part 2 - 생산자-소비자 문제

지난 글에서는 세마포어의 정의와, '상호배제 문제'와 '동기화 문제'를 세마포어가 어떻게 해결하는지에 대해 공부해보았다. 이번 글에서는 세마포어로 해결할 수 있는 문제 중 생산자-소비자 문제에 대해 다뤄보려고 한다. 생산자-소비자 문제란? 생산자-소비자 문제는 두 프로세스가 협력하여 데이터를 주고받는 상황을 다룬다. 생산자-소비자 문제에서는 세 가지 용어를 먼저 정의해야 한다. 생산자(Producer) : 데이터를 생성하여 버퍼에 넣는 프로세스소비자(Consumer) : 버퍼에서 데이터를 꺼내 사용하는 프로세스버퍼(Buffer) : 생산자와 소비자 사이에 데이터를 저장하는 공유 공간 생산자-소비자 문제에는 두 가지 조건이 있다. 상호배제 : 여러 프로세스가 동시에 버퍼에 접근할 수 없다. 즉, 생산자가 ..

[파이썬] 중첩 선택 구조 (feat. 놀이공원)

파이썬 프로그래밍에서 조건에 따라 다른 코드를 실행하는 선택 구조는 매우 중요하다. 특히 복잡한 조건을 처리해야 할 때 중첩 선택 구조가 필수적이다. 중첩 선택문은 영어로 Nested if statement라고 한다. Nested라는 단어에서 알 수 있듯, 중첩 선택문은 if문 안에 또 다른 if문이 들어가 있는 구조다. "이 안에 너 있다...."가 갑자기 왜 생각나지..ㅋㅋㅋ 중첩 선택문의 구조중첩 선택문은 다음과 같은 구조를 가진다. if 조건 1: # 조건 1이 참일 때 실행되는 코드 if 조건 2: # 조건 1과 조건 2가 모두 참일 때 실행되는 코드 else: # 조건 1은 참이지만 조건 2는 거짓일 때 실행되는 코드else: # 조건 1이 거짓..

[운영체제] 병행 프로세스 - 세마포어 완벽 정리 Part 1 - 상호배제, 동기화 (feat. 비행기 화장실)

운영체제에서는 프로세스의 상호배제 문제를 해결하기 위해 세마포어(semaphore)라는 도구를 사용한다. 상호배제란 여러 프로세스가 동시에 같은 자원(임계영역)을 건드리지 않도록 막는 것이다. 세마포어란? 쉽게 비유하면 자원의 좌물쇠 같은 역할이다. 세마포어는 정수형 변수(s)로 만들어졌는데, 이 값은 사용 가능한 자원의 개수나 잠김/열림 상태를 나타낸다. 예를 들어 s = 3 이면 사용 가능한 자원이 3개 있다는 뜻이니, 프로세스가 3개까지 들어갈 수 있다는 신호다. s = 0 이면 빈 자원이 없으니 대기하라는 뜻이다. 처음에 세마포어 s를 생성할 때, 상황에 맞춰 값을 설정한다. 이 값은 0 이상의 정수여야 한다. 그리고 이 s는 P와 V라는 두 가지 연산으로만 변할 수 있다. 즉, P 연산과 V 연..

[이산수학] 행렬곱은 어떻게 구할까? (feat. 펭귄 90도 회전시키기)

행렬의 합과 차는 직관적으로 이해가 되는 반면 행렬곱은 그 원리와 계산 방식이 다소 복잡하게 느껴질 수 있다. 하지만 행렬곱은 명확한 규칙을 기반으로 하기 때문에 규칙만 알면 간단하게 구할 수 있다. 👌 행렬곱이란?우선 행렬은 숫자(꼭 숫자가 아닐 수도 있음)들이 행(가로)과 열(세로)로 배열된 구조다. 간단한 예를 들어, 두 학생의 국어와 수학 점수를 행렬로 나타내면 다음과 같다. 첫 번째 행은 학생 A의 점수 (국어 80, 수학 90)을, 두 번째 행은 학생 B의 점수 (국어 70, 수학 60)을 의미한다.행렬곱은 두 행렬을 결합하여 새로운 행렬을 생성하는 연산이다. 첫 번째 행렬의 행과 두 번째 행렬의 열을 특정 규칙에 따라 곱하고 더해 새로운 값을 만드는 것이다. 행렬곱의 기본 원리와 조건행렬..

[파이썬] 다형성(Polymorphism) Part 1. 개념 이해하기 (feat. 우주청소로봇)

다형성이란? 다형성(polymorphism)이란 "같은 이름을 가진 기능이 상황에 따라 다르게 동작함"을 의미한다. 비유를 해 보면, 똑같은 단어 "먹다"도 상황에 따라 다르게 쓰인다. "밥을 먹다"일수도 있고, "빵을 먹다"일수도 있다.  마찬가지로 파이썬에서 다형성은 객체지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념 중 하나로, 이 개념을 코드로 구현한다. 예를 들어 같은 이름의 함수나 메서드를 쓰더라도 어떤 객체(object)를 다루느냐에 따라 결과가 달라질 수 있다.  예를 들어, 우주에서 쓰레기를 수집하는 로봇이 있다고 가정해 보자.  "진공 로봇"은 우주 먼지를 빨아들여 블랙홀 에너지로 바꾼다. "분쇄 로봇"은 고철 조각을 나노 입자로 분쇄해 우주로 ..

[이산수학] 조합이론 - Part 1. 순열과 조합의 차이 (feat. 팩토리얼)

순열(Permutation)이란?모든 순열의 수 :n개의 항목을 가지고 k개를 선택하면서 순서를 고려하는 경우의 수(= 순열의 수)는 n⋅(n−1)⋅(n−2)⋯(n−k+1)이다. 처음 상태: 총 n개의 항목이 있음.1번째 선택 후: 1개를 뽑았으므로 n−1개 남음.2번째 선택 후: 또 1개를 뽑았으므로 n−2개 남음.3번째 선택 후: n−3개 남음. ...(k-1)번째 선택 후: k−1개를 이미 뽑았으므로 n−(k−1)개 남음.이제 k번째 선택을 해야 하는데, 이 때 남아 있는 항목의 수는 n−(k−1)개."k번째 선택"은 총 k번 선택 중 마지막 번째를 의미함. 따라서 이미 k−1번을 선택한 후 남은 항목에서 하나를 더 고르는 상황.남은 항목 수 = n−(k−1) = n-k+1정리하면, 전체 순열의 수..

[파이썬] 슬라이싱 기본 규칙 - 문자열, 튜플, 리스트

파이썬의 슬라이싱 seq[start:stop:step]은 문자열, 리스트, 튜플 등 시퀀스 타입에서 특정 범위를 추출하는 도구로 다음과 같은 규칙을 갖는다. 1. 기본 구조형식: seq[start:stop:step]start: 시작 인덱스 (포함)stop: 종료 인덱스 (제외, 이 인덱스 직전까지 포함)step: 이동 간격 (기본값 = 1)위 세 매개변수는 모두 선택적이며, 생략 시 기본값이 적용된다. 2. 기본 동작슬라이싱은 start에서 시작해 stop 직전까지 step 간격으로 요소를 추출한다. 인덱스는 0부터 시작하며, 음수 인덱스도 사용 가능하다.  예시: text = "Python"인덱스: P(0) y(1) t(2) h(3) o(4) n(5)음수 인덱스: P(-6) y(-5) t(-4) h(-..

방송통신대학교 컴퓨터과학과 OT 후기

지난 주 토요일에 방송대 컴퓨터과학과 신/편입생 오티를 다녀왔다. 나는 추가모집기간에 편입학 지원서를 냈기 때문에 오늘 오전에야 합격 통지를 받고 등록을 마쳤다. 그래서 아직 정식 편입생은 아니었지만, 나보다 먼저 컴과과에 편입 등록하고 나를 학교로 인도해 준 친구들이 있어서 그들과 함께 오티에 갔다. 정말 오랜만에 찾은 대학로였다.파란 하늘을 보며 다시 대학생이 된 기분을 만끽하고 싶었지만 안타깝게도 미세먼지가 심한 날이었다. 오티가 열리는 대학본부 대강당 입구에서 학교에서 준비한 입학 선물을 이것 저것 받았다. 전혀 기대도 안했던 선물을 받아서 약간 신났다. Computer Science라는 학과 이름에 걸맞는 무려 멀티허브...그리고 파이썬 코드가 적혀있는 귀여운 캔버스백까지!심심해서 가방에 쓰..

[파이썬] 딕셔너리 - 딕셔너리 내용을 삭제하는 메서드

메서드/키워드 설명인자반환값특징예시del dict[key]특정 키-값 쌍 삭제키없음키가 없으면 KeyError 발생del my_dict['a']dict.pop(key, default)특정 키를 삭제하고 값을 반환키(기본값)삭제된 값키가 없으면 default 반환, 기본값 없으면 KeyError 발생my_dict.pop('a')dict.popitem()마지막 키-값 쌍을 삭제하고 반환없음(키, 값) 튜플파이썬 3.7+부터는 LIFO 순서로 삭제my_dict.popitem()dict.clear()모든 요소 삭제없음없음딕셔너리를 완전히 비움my_dict.clear()** LIFO(Last In, First Out) : 마지막에 들어온 것이 먼저 나가는 원칙. 즉, 가장 나중에 추가된 요소가 가장 먼저 제거됨...

[파이썬] 리스트 - 리스트 내용을 삭제하는 메서드 .remove(), .pop(), clear() 비교

메서드기능인자반환값특징remove(x)리스트에서 첫번째로 등장하는 x 삭제삭제할 요소 x(제거할 값을 받음)없음 (None)존재하지 않는 요소를 삭제하려 하면 ValueError 발생pop(i)i번째 요소 제거 후 반환삭제할 인덱스 i (인덱스 지정하지 않으면 마지막 요소 삭제)삭제된 요소인덱스를 벗어나면 IndexError 발생clear()리스트의 모든 요소 삭제없음없음 (None)리스트를 빈 상태 [ ]로 만듦 예제 코드lst = [10, 20, 30, 40, 50]# remove()lst.remove(30) # [10, 20, 40, 50]# pop()removed_item = lst.pop(1) # [10, 40, 50], removed_item = 20# clear()lst.clear() ..