목록전체 글 (24)
Exist Technote
Circular Queue란 선입선출 특성을 지니는 Queue의 일종으로, 최대 크기가 고정된 대기열이 필요할 때 사용할 수 있는 자료구조이다. 배열의 처음과 끝을 원처럼 연결한 것처럼 바라보아 요소를 넣을 지점과 꺼낼 지점에 해당하는 커서들을 이동시키며 큐로 사용하도록 구현되어 있다. 아래 구현 코드는 덮어쓰기가 불가능하도록 작성되어 있다. 그러나 일부 상황에서는 이를 허용해야 하는 상황이 생긴다. (소리 출력 버퍼가 원형 큐로 구현되어 있다고 하자. 소비자의 속도가 느릴 경우 공급자는 데이터를 덮어쓴다. 소비자는 손실된 출력 데이터를 무시하고 항상 최신 데이터를 소비한다.) 구현 from abc import ABCMeta, abstractmethod from typing import Generic, ..
Queue Queue란 선입선출(First In First Out) 특성을 지니는 자료구조를 말한다. 예로 들어 1차선 터널의 구조와 유사하다. 추상 자료형 위키피디아의 요구사항에 따라 구현되었다. 필수 Enqueue: 요소를 큐에 삽입한다. Dequeue: 요소를 큐에서 꺼낸다. 꺼낼 요소가 없는 경우 예외가 발생한다. 비필수 Peek: 요소를 꺼내지 않고 가장 앞 요소를 반환한다. 요소가 하나도 없는 경우 예외가 발생한다. Empty: 스택에 아무 요소도 포함되어있지 않으면 True, 아니면 False를 반환한다. Size: 스택에 삽입되어 있는 요소의 갯수를 반한한다. 구현 Deque 기반 구현 python에서 제공하는 deque를 활용. 아래 코드처럼, '인터페이스 변환 목적으로 감싸는 형..
Stack이란 후입선출(First In Last Out) 특성을 지니는 자료구조를 말한다. 예로 들어 프링글스 통의 형태와도 유사하며, 다른 예로는 책을 읽다가 모르는 단어가 나와 다른 책을 기존 책 위에 펼치고, 또 모르는 단어가 나와 위에 펼치는 형태로 중첩되어 쌓이는 형태를 들 수 있다. 힙 영역에서 일반적인 데이터를 저장할 때 사용되는 스택과 스택 영역 메모리에서 함수 콜 중첩 상태에서 사용되는 스택을 혼동할 수 있다. 추상 자료형 위키피디아의 요구사항에 따라 구현되었다. 필수 Push: 요소를 스택에 삽입한다. Pop: 요소를 스택에서 꺼낸다. 꺼낼 요소가 없는 경우 예외가 발생한다. 비필수 Top(or Peek): 요소를 제거하지 않고 스택 가장 위의 요소를 반환한다. 요소가 하나도 업는 경우..

Template Method Pattern이란? 알고리즘의 뼈대만을 정의하고 각 단계에서 수행할 구체적 처리를 서브클래스로 미루는 패턴 활용 어떤 알고리즘의 단계 중 변하지 않는 부분을 한 번 정의하여 변하는 부분을 서브클래스에서 정의할 수 있도록 남기고자 할 때 사용할 수 있다. 서브클래스들의 인스턴스들이 공통적인 연산 알고리즘을 지닐 때 리팩토링을 목적으로 사용할 수 있다. 구조 faif # template_function에 필요한 getter들. (필수) def get_text(): return "plain-text" def get_pdf(): return "pdf" def get_csv(): return "csv" # template_function에 필요한 converter. (훅) def co..

State Pattern이란? 객체 내부의 상태에 따라 스스로 행동을 변경할 수 있게끔 허가하는 패턴. 마치 자신의 클래스를 바꾸는 것처럼 보이게 된다. 예제 변경 전의 라디오 클래스 class Radio: STATIONS = { "AM": ["1250", "1380", "1510"], "FM": ["81.3", "89.1", "103.9"] } def __init__(self): self.modulation = "AM" self.stations_point = 0 def toggle(self): if self.modulation == "AM": self.modulation = "FM" print("FM으로 전환") else: self.modulation == "AM" print("AM으로 전환") def..
2020.10.13 정보처리기능사 필기를 통과하고 난 뒤의 기록. 다시 공부하라고 한다면 이렇게 공부했을 것 같다 - 를 기준으로 작성한다. 0. 4~7일 정도의 기간을 둔다. 1. (시나공은 구매하지 않았기 때문에 이기적 교재로 설명) 이기적 교재 필기를 구매한다. 2. 이기적 교재 필기의 가장 뒷쪽에 있는 부록 문제집을 분리한다. 3. 해당 부록을 모두 풀어본다. (기출문제 130 + 모의고사 5개) 4. 모의고사 5개 분량에서 틀린 문제들만을 선별한다. 5. 130개의 문제를 위주로 반복학습하며 틀린 문제를 암기한다. 60개의 문제 중에서 절반 이상이 기출문제에서 출제되었다고 느꼈으며 위와 같이 공부할 경우 70 ~ 80점 정도로 합격할거라 생각한다. "문제은행 방식"이 이런거구나 싶다.

Registry Pattern이란? 어떤 클래스의 모든 서브 클래스를 참조하고 싶을 때 사용할 수 있는 패턴 예제 원본 커스텀 # 메타클래스 정의(클래스를 생성하는 클래스) class RegistryMetaClass(type): def __new__(cls, name, bases, attrs): # 클래스를 생성한다. new_cls = type.__new__(cls, name, bases, attrs) # 클래스의 속성에 REGISTRY가 있다면 # bases 내에 RegistryMetaClass를 메타 클래스로 활용한 슈퍼 클래스가 있다는 의미로 간주하여 if hasattr(new_cls, "REGISTRY"): # (다중 상속에도 원하는 방식으로 동작하도록) for base in bases: if h..

Chaining Method란? 메서드가 객체를 반환하여 연쇄적으로 메소드를 이어 동작시킬 수 있는 패턴. 예제 원펀맨 훈련법 class Person: def __init__(self, start=None, end=None): self.actions = [] def traning(self, action:str): self.actions.append(action) return self @property def schedule(self): return "\n".join(self.actions) saitama = Person() # 원하는 만큼 다양한 traning을 추가할 수 있다. # 또한 체이닝만 구현한다면 다른 객체의 메서드 체인으로 넘어갈 수도 있다. saitama\ .traning("푸쉬업 100회..

Observer Pattern이란? 감시자 패턴. 객체들 사이에 일대 다의 의존 관계를 정의하여, 일 객체의 상태가 변할 때 다 객체들이 변화를 통지받아 동작을 수행할 수 있게 만드는 패턴. 구독-발행 패턴과 유사점이 많다. 예제 from contextlib import suppress # 옵저버들을 관리하는 객체 subject. 확장할 수 있도록 설계된 구조가 멋지다. class Subject: # 옵저버를 추가 or 제거 def __init__(self) -> None: self._observers = [] def attach(self, observer) -> None: if observer not in self._observers: self._observers.append(observer) def ..

Proxy Pattern이란? 특정 타 객체로 접근하는 것을 통제하기 위해 해당 객체의 대리자 또는 자리채움자를 제공하는 패턴. 인터페이스를 변경하지 않으면서 기능을 추가하기 위해 사용되는 패턴. 예제 # RealSubject의 do_the_job의 기능으로 불만족스럽다. # RealSubject를 수정하지 않으면서 기능을 추가하고 싶다. class RealSubject: def do_the_job(self, user: str) -> None: print(f"{user}(이)가 작업을 수행합니다.") # 동일한 인터페이스를 지닌 클래스를 선언하여 (ABC를 선언하여 상속해도 되겠다.) class Proxy: def __init__(self) -> None: # has 관계로 소유하여 self._real_..