본문 바로가기

분류 전체보기

[기하학] BOJ 7869 - 두 원 (두 원이 교차하는 영역의 넓이) 문제두 원이 주어졌을 때, 교차하는 영역의 넓이를 소수점 셋째자리까지 구하는 프로그램을 작성하시오.입력첫째 줄에 두 원의 중심과 반지름 x1, y1, r1, x2, y2, r2가 주어진다. 실수는 최대 소수점 둘째자리까지 주어진다.출력첫째 줄에 교차하는 영역의 넓이를 반올림해 소수점 셋째자리까지 출력한다. 수능 수학영역에서 나올 법한 기하 문제이다. 풀이에 피타고라스의 정리와 삼각함수(코사인 법칙)를 사용하였다.먼저, 주어진 문제에서 추가적인 조건 없이 두 원의 중심 좌표(x, y)와 반지름의 길이(r)가 주어졌다. 나올 수 있는 넓이를 구하는 데 사용되는 방식을 두 원의 중심 사이의 거리와 각각의 반지름의 관계에 따라 나누어야 한다.따라서 아래와 같이 세 가지 경우로 표현하고 연산 방식을 분기할 수 있..
[C#] 가비지 컬렉션과 오브젝트 풀링 프로그램에 있어 동적 할당은 매우 중요한 부분을 차지한다. 단순히 함수 내부에서 스택 구조에 의해 할당되는 지역 변수와는 달리, 클래스의 인스턴스들은 힙 영역 안의 한구석에 자리를 잡으며 자신의 직책을 묵묵히 수행한다. 그리고 그들의 임무가 끝나면. 프로그래머가 안내하는 코드에 의해 힙 영역을 떠나게 된다. 하지만, 프로세스 안에서 할당된 수없이 많은 인스턴스들을 모두 추적해 원하는 시점에 해제를 하기란 매우 어려운 법이다. 게다가 사소한 실수로 인해 인스턴스들이 손아귀 밖으로 벗어났을 땐, 메모리 누수라는 거대한 눈덩이가 되어 프로세스를 덮치기 일쑤였다. 그래서, 여러 컴퓨터 학자들은 메모리를 프로그래머가 신경 쓰지 않아도 손쉽게 관리하는 방법을 고안하고, 마침내 가비지 컬렉션(쓰레기 수집)이라는 해결..
[GoF] 방문자 (Visitor) 패턴 방문자 (Visitor) 패턴 행동 패턴객체 구조에 대한 알고리즘을 외부에서 정의합니다. 방문자 패턴을 통해 객체 구조를 수정하지 않고 새로운 알고리즘을 추가할 수 있습니다. 일반적으로 객체에 대한 알고리즘은 객체 안에서 구현되어 객체의 구조와 같이 정의될 수 있다. 하지만, 객체 구조와 큰 관련이 없는 알고리즘을 객체 내에서 구현한다면 객체 지향 프로그래밍에서의 단일 책임 원칙과 개방-폐쇄 원칙을 위배할 수도 있다. 그래서, 이에 대해 동일한 계열의 알고리즘군을 객체 구조 밖으로 빼내어 캡슐화할 수 있도록 방문자 패턴을 사용할 수가 있다.방문자 (Visitor) 패턴은 객체에 대한 알고리즘을 객체의 구조로부터 분리하여 방문자 객체에 구현하는 패턴이다. 방문자 패턴에서 객체는 방문자 객체에 '방문하여' ..
[GoF] 중재자 (Mediator) 패턴 중재자 (Mediator) 패턴 행동 패턴한 집합에 속하는 여러 객체들 간의 상호 작용을 중재합니다. 객체들은 대상을 직접 알지 않고도 상호 작용을 할 수 있게 됩니다. 객체 지향 프로그래밍에서의 단일 책임 원칙에 의하면, 프로그램은 책임에 따라 여러 객체로 나뉘어지고 그 객체들 간의 상호 작용을 통해 프로그램의 실질적인 구현을 수행할 수 있게 된다. 하지만, 이 객체 구조가 복잡해질 경우 그들의 참조 관계는 기하급수적으로 늘어나 관리가 매우 어려워질 것이다. 이 때, 객체 구조가 복잡해지더라도 참조 관계를 하나의 객체로 정리할 수 있도록 하는 중재자 패턴을 사용할 수 있다.중재자 (Mediator) 패턴은 상호 작용에 관련된 내용을 객체화함으로써 중재자 객체가 여러 객체들 간의 상호작용을 중재하게 된다..
[GoF] 템플릿 메서드 (Template Method) 패턴 템플릿 메서드 (Template Method) 패턴 행동 패턴알고리즘의 일부 단계를 서브 클래스로 위임하여, 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계를 재정의 할 수 있도록 합니다. 객체 지향 프로그래밍에서의 클래스는 상속을 통해 메소드를 재정의할 수 있다. 이를 통해 클래스를 상속함으로써 다른 알고리즘을 구현할 수 있는데, 이 알고리즘이 서로 비슷하다 하더라도 다시 재정의 해야만 한다. 이런 클래스의 상속에 대한 한계적인 부분을 템플릿 메서드 패턴을 통해 해결할 수 있다.템플릿 메서드 (Template Method) 패턴은 알고리즘을 템플릿화 하여, 상위 클래스에서 알고리즘의 뼈대만 정의하고 구체적인 처리는 추상화하여 상속을 통해 구현할 수 있도록 하는 패턴이다. 상위 클래스의 메서드에선 ..
[GoF] 반복자 (Iterator) 패턴 반복자 (Iterator) 패턴 행동 패턴컨테이너를 가로지르는 객체를 통해 컨테이너의 요소들을 순회할 수 있도록 해 줍니다. 일련의 데이터 집합을 저장하기 위해 사용되는 컨테이너는 크게 두가지 용도로 사용되어진다. 첫 번째는 컨테이너의 특정 요소를 검색하는 것이고, 두 번째는 컨테이너 안의 모든 요소를 순회하는 것이다. 이 순회의 방법으로는 컨테이너의 종류에 따라 다양하다.예를 들어, 일반적인 배열의 모든 요소를 순회하려 한다면 색인을 위한 정수를 하나 선언하고 반복문을 통해 값을 늘려가며 배열의 끝까지 차례대로 접근할 수 있고, 연결 리스트의 모든 요소를 순회하려 한다면 첫번째 노드에 접근하여 그 노드가 참조하는 다음 노드를 계속 접근해서 마지막 노드까지 접근하는 것으로 연결 리스트의 모든 요소를 접근..
[GoF] 전략 (Strategy) 패턴 전략 (Strategy) 패턴 행동 패턴특정한 계열의 알고리즘을 캡슐화하여 동적인 교체가 가능하도록 합니다. 전략이란 어떤 목적을 달성하기 위해 행동하는 방식을 일컫는다. 전략이란 단어를 프로그래밍적으로 해석하면 알고리즘이라 할 수도 있는데, 알고리즘은 프로그래밍에서 작업을 수행하기 위한 필수적인 요소이다.객체지향 프로그래밍에서의 객체는 요구하는 작업을 수행하기 위해 알고리즘을 사용하게 되는데, 알고리즘을 수행할 객체 안에 직접 알고리즘을 구현한다면 객체는 해당 알고리즘과 강한 결합이 생겨 알고리즘을 추가하거나 변경해야 할 경우 해당 객체를 직접 수정해야 하고, 객체가 사용하고 있는 알고리즘을 전환하기 어려우며, 다른 객체에서 동일한 알고리즘을 중복적으로 구현하게 되는 상황이 발생할 수도 있다. 그래서,..
[GoF] 해석자 (Interpreter) 패턴 해석자 (Interpreter) 패턴 행동 패턴문법을 해석할 수 있는 객체를 조합하여 구문을 특정한 문법으로 해석할 수 있도록 합니다. 윈도우 운영체제에서의 명령 프롬프트(Command Prompt)는 명령어를 입력함으로써 윈도우의 여러 작업을 수행할 수 있게 해준다. 여기서 명령어는 일련의 문자열로 구성되어진 명령 프롬프트에서 약속된 문법이다. 명령 프롬프트에 명령어를 입력하면 명령 프롬프트가 이를 해석하고 명령어에 명시된 일련의 처리 과정을 수행하게 된다. 명령어와 같이 약속된 문법을 해석하게 할 수 있는 해석자 패턴을 사용하면 클라이언트가 전달하는 구문을 해석하여 이에 대응되는 처리를 수행할 수 있도록 해 준다.해석자 (Interpreter) 패턴은 여러 객체들을 조합하여 문법을 정의할 수 있게 한..
[GoF] 상태 (State) 패턴 상태 (State) 패턴 행동 패턴객체의 다양한 상태를 객체화하여 객체가 상태에 따라 다른 행동을 할 수 있게 합니다. 어떤 객체는 조건에 따라 하나의 상태를 가져 상태에 따라 다른 행동을 할 수가 있다. 예를 들어, 어떤 게임 속 플레이어는 서 있거나, 걷거나 뛸 수 있다. 그러므로 플레이어는 이동에 대한 상태를 가질 수 있다. 그리고 플레이어가 서 있으면서 뛸 수 없듯이, 객체는 하나의 상태만 가질 수 있고, 서 있던 플레이어가 외부 입력을 통해 달리게 되듯이 객체는 상태를 바꿀 수 있다(상태 전이). 이런 객체의 형태를 유한 상태 기계(Finite-State Machine, FSM)라고 하는데, 이는 소프트웨어를 설계하는 데에 쓰이는 추상적인 모델이다.그렇다면, 이제 유한 상태 기계를 구현한 객체를..