본문 바로가기

728x90

C++

[디자인패턴][구조패턴] 퍼싸드 Facade - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Facade pattern 퍼싸드(퍼사드)는 프랑스어로 출입구가 있는 건물의 앞부분을 말한다. 이번 패턴은 특이하게 터미널에 대한 이야기를 통해 설명을 진행한다. 먼저 운영 체제에서 제공하는 터미널/콘솔의 CLI와 금융권의 금융 데이터 문자 렌더링은 미묘한 차이가 있따. 터미널은 어떻게 동작할까? 터미널 윈도의 첫 번째 구성 요소는 버퍼다. 버퍼에 렌더링할 문자들이 저장된다. 버퍼는 보통 char/wchar_t 타입의 1차원 또는 2차원 배열로 만들어진다. 버퍼는 보통 현재의 입력 라인을 가리키는 어떤 표시를 갖는다. 그 표시를 이용해 버퍼가 가득 찼을 때, 항상 새로운 라인을 할당하는 것이 아니라 가장 오래된 라인부터 덮어쓰면.. 더보기
[백준알고리즘] 11444번: 피보나치 수 6 -C++ [백준알고리즘] 11444번: 피보나치 수 6 -C++ 11444번: 피보나치 수 6 (acmicpc.net) 11444번: 피보나치 수 6 첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 골드 난이도면서 정답 비율이 높길래 되게 쉬운 문제인 줄 알았다. 근데 난생처음 보는 풀이를 보고 따라 풀었다. 이 문제를 푸는 방법은 2가지가 있다고 한다. 행렬 곱을 이용한 방법과 방정식을 이용한 방법이다. 아래는 방정식으로 문제를 풀었다. 문제를 푸는 방식은 백준 블로그의 글을 참고했다. 피보나치 수를 구하는 여러가지 방법 (acmicpc.net) 피보나치 수를 구하는 여러가지 방법 피보나치 수는 다음과 같이 정의되는 수열입니.. 더보기
[백준알고리즘] 1802번: 종이 접기 -C++ [백준알고리즘] 1802번: 종이 접기 -C++ 1802번: 종이 접기 (acmicpc.net) 1802번: 종이 접기 첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 1000보다 작거나 같은 자연수이다. 둘째 줄부터 T개의 줄에 각각의 종이가 어떻게 접혀있는지가 주어진다. 종이의 정보는 문자열로 주어지며, 1 www.acmicpc.net 문제만 읽었을 때는 되게 어려운 문제라고 생각했다. 문제를 푸는 방법을 찾았을 때도 시간 초과가 괜찮을지 걱정했었는데 여유로운 시간이었다. 정답 비율만 보고 살짝 어려운 문제인가 싶었는데 실버 문제는 실버 문제였다. 분할 정복으로 분류되어 있는데, 분할 정복인가.. 싶긴 하다. 문제 풀이 문제의 내용은 사실 대부분이 불필요한데 괜히 길다. 아무튼 원룡이가 막 접었.. 더보기
[백준알고리즘] 2470번: 두 용액 -C++ [백준알고리즘] 2470번: 두 용액 -C++ 2470번: 두 용액 (acmicpc.net) 2470번: 두 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00 www.acmicpc.net 골드 5의 문제다. 정답 비율도 낮아서 생각보다 어렵나 하고 풀었는데 생각보다 훨씬 쉽게 풀리긴 했다. 예전에 비슷한 느낌의 문제를 푼 적이 있던 것 같은데, 그 덕분인지는 모르겠다. 전부터 골드 5의 문제들이 적당히 난이도 있고 풀기에 좋았던 것으로 기억한다. 그래서 진짜 어려운 문제는 아니었을 수도 있다. 문제 풀이 문제에서는 여러 .. 더보기
[백준알고리즘] 10867번: 중복 빼고 정렬하기 -C++ [백준알고리즘] 10867번: 중복 빼고 정렬하기 -C++ 10867번: 중복 빼고 정렬하기 (acmicpc.net) 10867번: 중복 빼고 정렬하기 첫째 줄에 수의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. www.acmicpc.net 사실 이번 문제는 굉장히 쉬운 문제다. 정렬 알고리즘이라고 해서 풀려고 했는데, 너무 민망할 정도의 문제다. 그래서 글을 따로 작성하지 않으려다가 그냥 기록용으로 남긴다. 문제 풀이 문제에서 요구하는 조건 중에 주목할 것은 오름차순 정렬과 중복을 제거하는 것이다. 가장 먼저 생각이 든 것은 C++의 set를 이용하는 방식이다. set는 JAVA의 HashSet과 유사한 개념이다.. 더보기
[디자인패턴][구조패턴] 데코레이터 Decorator - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Decorator pattern 동료가 작성한 클래스 기반으로 기능 확장을 한다고 해보자. 원본 코드를 수정하지 않고 기능을 추가하기 위한 방법 중에서 상속이 생각날 수 있다. 하지만 항상 이렇게 작업할 수 있지는 않다. 상속을 할 수 없는 여러 사정이 있을 수 있다. 무엇보다 수정하는 이유가 여러 가지인 경우에는 단일 책임 원칙(SRP)을 위반하는 것이기 때문이다. Decorator 패턴은 이미 존재하는 타입에 새로운 기능을 추가하면서도 원래 타입의 코드에 수정을 피할 수 있도록 해준다. OCP를 준수하는 것이다. 시나리오 여러 개선 작업이 필요한 상황을 생각해보자. 도형을 기반으로 색상이 있는 도형과 투명한 도형을 상속받아 .. 더보기
[디자인패턴][구조패턴] 컴포지트 Composite - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Composite Pattern 보통 공부할 때 Aggregation 관계와 Composite 관계는 생명주기에서 다르다고 말을 한다. 하지만, 이 책에서는 두 개를 서로 동등한 것으로 취급한다. 객체가 복수의 구성 요소로 이루어져 있다는 것을 의도적으로 사용자에게 알려줄 방법은 많지 않다. 우선, 명시적으로 멤버 변수에 대한 getter/setter를 노출하는 방법이 있다. 이때, begin/end 반복자와 같은 것으로 구성 요소의 집합이라는 것을 알려야 한다. 다른 방법으로는 컨테이너 타입을 상속받는 것이다. 하지만, STL 컨테이너는 virtual 소멸자가 없기 때문에 소멸자를 쓸 일이 없어야 한다. Composite 패턴.. 더보기
[백준알고리즘] 2589번: 보물섬 -C++ [백준알고리즘] 2589번: 보물섬 -C++ 2589번: 보물섬 (acmicpc.net) 2589번: 보물섬 첫째 줄에는 보물 지도의 세로의 크기와 가로의 크기가 빈칸을 사이에 두고 주어진다. 이어 L과 W로 표시된 보물 지도가 아래의 예와 같이 주어지며, 각 문자 사이에는 빈 칸이 없다. 보물 지도의 www.acmicpc.net 문제를 봤을 때 브루트 포스인가? 단순히 최단거리는 못 구하는데? 일단 해보자! 했다. 예전에는 너무 최단거리 문제만 풀다가 브루트 포스 문제 여부를 감을 잡지 못했었는데, 지금 오히려 눈이 넓어졌나보다. 골드라고 해서 살짝 쫄았는데 정답 비율은 생각보다 높았다. 어쩐지 어렵진 않더라.. 문제 풀이 문제는 브루트 포스 방식을 사용하면 된다. 그리고 그래프 탐색을 사용하면 된다... 더보기

728x90