분류 전체보기

    [백준 5547] 일루미네이션 (C++)

    [백준 5547] 일루미네이션 (C++)

    5547번: 일루미네이션 첫째 줄에 두 개의 정수 W와 H가 주어진다. (1 ≤ W, H ≤ 100) 다음 H줄에는 상근이네 집의 건물 배치가 주어진다. i+1줄에는 W개의 정수가 공백으로 구분되어 있다. j번째 (1 ≤ j ≤ w) 정수의 좌표는 www.acmicpc.net BFS 구현 문제이다 위 그림에서 2,3 좌표는 비어있는데 건물에 둘러싸인 '내부 공간'이다. 건물이 좌표 바깥이나 외부 공간과 맞닿아 있다면 답을 +1 해주면 되는데, 내부 공간이라는 변수 때문에 단순한 bfs로는 풀리지 않는다. 따라서 빈 공간이 내부 공간인지, 외부 공간인지를 미리 판단 해 놓아야 한다. 그걸 어떻게 판단하는가? 하나 이상으로 이어진 외부 공간은 좌표 바깥 부분과 맞닿아있다. 따라서 좌표의 경계선에 위치한 빈 ..

    RabbitMQ, Redis, Kafka의 특징

    마이크로서비스에 대한 비동기 통신을 구현하기 위해서 메시지 브로커를 선택해 사용할 수 있다. MSA를 구축하기 위해서 메시지 브로커가 무엇인지를 이해하고, 많은 브로커들 중 어떤걸 사용할 지도 정해야 한다. 그래서 메시지 브로커중에서 가장 많이 쓰이는 RabbitMQ, Redis, kafka를 비교, 정리해보려고 한다. RabbitMQ, Redis, Kafka 같은 기술을 메시지 플랫폼이라고 한다. 메시지 플랫폼은 2가지 종류로 나뉘어진다. 메시지 브로커 이벤트 브로커 이 둘을 간단히 설명하면 다음과 같다. 메시지 브로커는 이벤트 브로커의 역할을 할 수 없지만, 이벤트 브로커는 메시지 브로커의 역할을 할 수 있다. 메시지 브로커 대규모 메시지 기반 미들웨어 아키텍쳐에서 사용되어왔다. 미들웨어란? 애플리케..

    [프로그래머스] level2 전화번호 목록 (C++)

    C++에서 map을 사용한 해시로 쉽게 풀 수 있다. 나는 보자마자 트라이를 쓰는 문제 같았다. 해시를 떠올리지 못했다. 해시로 푸는 방법은 아래 블로그 참고 [Programmers] 전화번호 목록 간단한 문자열 문제입니다. 백준에서 골드 4정도의 완전히 동일한 문제가 있습니다. 동일한 문제이지만, 이... blog.naver.com 트라이의 특징은 문자열의 종료 위치를 표시해준다는 점이다. 따라서 주어진 배열을 먼저 길이 순으로 오름차순 정렬하고, 길이가 같은 경우에는 문자열의 값에 따라 오름차순 정렬한다. 이렇게 먼저 정렬해주면 뒤에 나오는 문자열이 그보다 앞에 나오는 문자열의 접두사인 경우를 배제할 수 있다. 그렇게 트라이로 풀 수 있는 조건이 성립하게 된다. 트라이에 문자를 하나씩 넣으면서 트라이..

    [프로그래머스] level2 단체사진 찍기 (C++)

    [프로그래머스] level2 단체사진 찍기 (C++)

    2017 카카오코드 본선 사람이 8명 뿐이다. 모든 사람을 줄세우는데 O(8!) 만큼의 시간이 걸릴 것이다. 따라서 백트래킹으로 모든 경우를 탐색해도 시간내에 충분히 풀린다. 백트래킹 부분 void sorting(int cnt, int &answer, vector &data, map &m){ if(cnt == 8){ if(is_valid(data, m)){ answer++; } return; } for(int i = 0; i < 8; i++){ if(visited[i]) continue; visited[i] = cnt+1; sorting(cnt+1, answer, data, m); visited[i] = 0; } } 중요한 부분은 visited배열의 정의이다. visited배열의 인덱스는 사람의 번호이다..

    [프로그래머스] level2 빛의 경로 사이클 (C++)

    [프로그래머스] level2 빛의 경로 사이클 (C++)

    월간 코드 챌린지 시즌 3 그림만 보면 무시무시하지만 실제 풀이는 그렇지 않다. 하나의 격자에 빛을 쏘면 내부에서 사이클을 이룬다. 내부에서 퍼지는 게 아니라 하나의 길로 쭉 들어간다고 생각해서 바로 dfs로 풀었다. bool cache[501][501][4]; cache 배열이 중요하다 cache[r][c][dir] r, c 의 격자에 dir 방향으로 들어온 적이 있는지를 체크하는 배열이다. 나는 dir 방향으로 들어온 적이 있다면 반드시 그 경우에 해당하는 사이클이 존재한다고 생각했다. 적어도 위 예제만 봐도 모든 경로를 다 탐색한다. 만약 다른 예제가 오더라도 아직 방문하지 않은 경로를 시작점으로 탐색을 하는데, 이미 탐색한 다른 경로를 건드릴일이 절대로 없다는 것이다. bool &ret = cac..

    [프로그래머스] level2 튜플 (C++)

    2019 카카오 겨울 인턴십 배열이 주어지고, 튜플을 만드는 방법을 문제에서 친절히 알려줬다. 원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'를 이용해 표현할 수 있습니다. {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}} 예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는 {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}} 문제에서 원하는 답은 튜플을 분석해서 원래의 배열을 구하라는 것이다. 문제는 튜플이 문자열로 주어진다는 것이다.. 나는 C++..

    [K8S] 쿠버네티스 파드의 생명주기

    쿠버네티스의 장점은 쿠버네티스의 구성요소들이 하는 일이 명확하게 구분되어있어서 각자의 역할만 충실하게 한다면 클러스터 시스템이 안정적으로 운영된다는 점이다. 각자의 역할이 명확히 나눠진 점은 마이크로서비스 아키텍쳐(MSA) 구조와도 밀접하다. 또한 역할이 나뉘어있기 때문에 문제가 발생했을 때 디버깅하기도 쉽다. 파드의 생명주기란? 파드가 생성, 수정, 삭제되는 과정을 의미한다. 알아보자 개발자가 kubectl 커맨드라인을 통해서 API 서버에 파드 생성을 요청한다. (create) API 서버는 etcd안에 전달된 내용을 모두 기록해 클러스터의 상태 값을 항상 최신으로 유지한다. 따라서 각 요소(etcd, API서버, 컨트롤러 매니저, 스케줄러)가 상태를 업데이트할 때마다 API 서버를 통해서 etcd에..

    [K8S] 쿠버네티스 구성요소

    [K8S] 쿠버네티스 구성요소

    쿠버네티스의 구성 요소의 유기적인 연결 관계를 표현하면 다음과 같다. 하나의 쿠버네티스 생태계를 쿠버네티스 클러스터라고 한다. 파드를 배포하는 순서에 따라서 요소들의 역할을 알아보자 마스터 노드 : 클러스터의 '두뇌' 역할을 담당한다. kubectl 쿠버네티스 클러스터에 명령을 내리는 커맨드라인 도구이다. docker를 사용하기 위해서 모든 명령어가 docker ... 로 시작하는데, 쿠버네티스도 마찬가지로 클러스터에 명령을 내리기 위해서는 kubectl .. 이 명령의 시작이 된다. 일반적으로 개발자는 API 서버와 주로 통신하므로 API가 서버가 위치한 마스터 노드에 구성된다. 자주 쳐야하는 명령어지만 타이핑이 까다로워서 alias kbc='kubectl'로 설정하면 편하다. API 서버 쿠버네티스 ..

    [Django] ModelViewSet에서 Retrieve의 동작 원리

    [Django] ModelViewSet에서 Retrieve의 동작 원리

    APIView를 상속받는.. GenericAPIView를 상속받는.. GenericViewSet을 상속받는.. ModelViewSet은 mixins를 모두 상속받는다. 3단 추상화 .... Retrieve란? mixinx.RetrieveModelsMixin에 구현되어있는 메서드이다. 찾고자 하는 모델의 세부 정보를 반환한다. 어떻게 찾고자 하는 모델을 알 수 있을까? 우선 RESTful 규칙에 지키며 통신이 이루어진다고 가정하자. [GET] http://localhost/post/3 위와 같은 url은 id가 3인 post를 요청하는 것이다. 해당 url을 받아들일 수 있는 django의 urls.py를 보면 urlpatterns = [ path('post/', ...), ] 이런 식으로 되어있을 것이다..

    [프로그래머스] level2 행렬 테두리 회전하기 (C++)

    2021 Dev 매칭-벡엔드 2차원 좌표에서 직사각형을 정하고, 테두리를 시계방향으로 회전시키는것을 구현하는 문제이다. 완전히 구현력을 요구하는 문제이다. 삼성 A형 기출문제와 느낌이 비슷했다. 직사각형과 회전시킬 영역이 주어진다. 나는 회전을 위해서는 4개의 꼭짓점만 알면 된다고 생각했다. 그래서 주어지는 queries배열에서 4개의 꼭짓점을 추출하고, 되돌아오는 것 까지 생각해서 총 5개의 점을 vertex 벡터에 입력했다. for(auto &q: queries){ vector vertex; vertex.push_back({q[0], q[1]}); vertex.push_back({q[0], q[3]}); vertex.push_back({q[2], q[3]}); vertex.push_back({q[2]..