본문 바로가기

분류 전체보기

(698)
Kafka 기본 개념 [1. Kafka 란?] Publisher, Consumer 모델의 메시지 큐 이다. Publisher 가 어떤 Topic 을 주제로 메시지를 발행하면, 해당 Topic 을 구독하는 Consumer 가 발행된 메시지를 가져가는 것이다. [2. Kafka 구성요소] broker Kafka 서버(머신)를 칭한다. broker.id 라는 설정 값을 통해서 클러스터 내에서 구분된다. zookeeper broker 를 관리하는 관리자 역할을 한다. => kafka 노드 관리 및 topic 의 offset 정보등을 관리한다. kafka 서버를 실행하기 위해서는 zookeeper 의 실행이 반드시 선행되어야 한다. topic kafka 내에서 메시지를 분류하기 위한 하나의 단위 topic 이 같은 메시지는 같은 공간..
Kafka 설치 및 실행 [1. Kafka 다운로드] 아래 웹 사이트에서 바이너리 버전을 다운 받도록 한다. https://kafka.apache.org/downloads [2. Zookeeper 설정] Kafka 실행을 위해서는 먼저 Zookeeper 를 실행해야 하며, 실행 시 설정 파일 경로를 인자로 전달한다. 다만, 다운 받은 직후 설정 파일은 리눅스 기반으로 하고 있기 때문에 윈도우 OS 에서는 일부 설정 값을 변경 할 필요가 있다. config\zookepper.properties 위 파일에서 dataDir 설정 값을 PC 환경에 맞게 수정하도록 한다. 윈도우는 파일 경로 구분자를 (\) 로 처리하는데, 설정 값에서는 리눅스 파일 경로 구분자로 작성하는 편이 더 나은 거 같다. (설정 파일에 "\\" 로 써야 제대로 ..
[동적 계획법] JLIS [1. 문제 재정의 및 추상화] [2. 해결 계획] 두 수열의 LIS 를 찾은 뒤 각각 합치면 해결 할 수 없다 LIS 를 구하는 재귀 함수의 입력을 두개로 늘려야 함 => 각 수열을 받기 위해 => A[indexA] 와 B[indexB] 에서 시작하는 합친 증가 부분 수열의 최대 길이를 구하는 함수 A[indexA] 와 B[indexB] 중 작은 쪽이 앞에 온다고 가정 이 증가 부분 수열의 다음 숫자는 두가지 경우가 존재 1. A[indexA +1] 이후 또는 2. B[indexA +1] 이후 수열 중 max(A[indexA], B[indexB]) 보다 큰 수 중 하나 => 증가 부분 수열이 되기 위해선 A[indexA], B[indexB] 보다 큰 값이 뒤에 와야 한다. [3. 계획 검증]
[동적 계획법] WILDCARD [1. 문제 재정의 및 추상화] 와일드카드 패턴을 앞에서 한 글자씩 파일명과 비교해서 모든 글자 일치 시, 와일드카드 패턴이 파일명과 대응된다 말함 '?' 는 어떤 글자와도 대응된다 가정함 '*' 는 0글자 이상의 어떤 문자열에도 대응 됨. 주어진 와일드카드 패턴에 대응되는 문자열 출력 ex) 와일드카드 패턴 he?p 에 매치되는 문자열은 아래와 같다 heap, help helpp 는 ? 가 lp 에 대응 될 수 없기 때문이다 패턴이 아닌 문자열은 알파벳 대소문자와 숫자만으로 구성 됨. [2. 해결 계획] 완전 탐색 풀이 #include // w: 와일드카드 패턴 // s: 문자열 bool match(const std::string &w, const std::string &s) { int pos = 0;..
동적 계획법 [1. 도입] 큰 의미에서 분할 정복과 같은 접근 방식을 의미한다 다만, 어떤 부분 문제가 두 개 이상의 문제를 푸는데 사용 될 때 이 문제의 답을 한번만 계산 하고 향후 이 결과를 재활용하여 속도 향상을 노려볼 수 있다. 여기서 두 번 이상 계산 되는 부분 문제를 중복되는 부분 문제라 한다. [2. 메모이제이션] 한 번 계산한 값을 저장해두었다가 재활용하는 최적화 기법 참조적 투명 함수인 경우 적용 가능함 참조적 투명 함수란? => 입력이 고정되어 있을 때 그 결과가 항상 같은 함수 => 함수의 반환 값이 그 입력 값만으로 결정되는지의 여부를 참조적 투명성이라 함. [3. 메모이제이션 구현 패턴] 기저 사례를 먼저 처리 => 입력이 범위를 벗어난 경우, ... 가능한 경우 cache[] 를 모두 -1로..
[분할 정복] FENCE [1. 문제 재정의 및 추상화] 너비가 같은 N 개의 나무 판자에서 잘라낼 수 있는 많은 직사각형 중 가장 큰 직사각형의 넓이 단, 비스듬히 잘라 낼 수 없다. N 은 최대 20000 까지 주어짐 TestCase 는 최대 50 까지 주어짐 [2. 해결 계획] 완전 탐색에서 시작 left = 0 ~ right = N 까지 범위에서 최대 넓이를 찾고 left = 1 ~ right = N 까지 범위에서 최대 넓이를 찾고, ... 분할 정복으로 계산 한다면, A) 가장 넓은 직사각형이 중앙에서 왼쪽에 존재하는 경우 B) 가장 넓은 직사각형이 중앙에서 오른쪽에 존재하는 경우 C) 가장 넓은 직사각형이 왼쪽과 오른쪽에 걸쳐있는 경우 Case C 의 경우, 최초에는 중앙에 두개의 판자를 모두 덮을 수 있게 둘 중 최..
Slice length, capacity and append, copy function [1. length] make() 를 이용해 Slice 를 생성 할 때, slice 의 길이를 명시한다. C++ std::vector 에서 resize() 와 같은 역할을 한다. built-in 함수 len() 을 이용해 Slice 의 length 를 얻을 수 있다. 1 이상의 length 가 할당 된 경우 [] 연산자를 통해 값에 접근 할 수 있다. => C++ vector 에서 resize() 후 [] 연산자로 container 를 업데이트 하는 방식 ex) slice := make([]int, 10) [2. capacity] make() 를 이용해 Slice 를 생성 할 때, slice 의 capacity 를 명시한다. C++ std::vector 에서 reserve() 와 같은 역할을 한다. bu..
Array & Slice [1. 배열] Go 에서 배열은 Slice 와 달리 고정된 크기의 길이를 갖는다. 또한, 같은 자료형을 저장 할 지라도 이 길이가 다르면 서로 다른 자료형으로 처리한다. 아래 코드에서 주석을 해제하면 실행과 빌드 모두 되지 않는다. [2. Slice] 배열을 기초로 하지만, 그 크기를 동적으로 관리 할 수 있다. 또한, 부분 Slice 가 가능하다. 실제로, 배열과 비슷하게 선언을 하지만, 그 길이를 따로 명시하지 않는다. [3. 예제] package main import "fmt" func slice_test(sl []int) { if len(sl) > 0 { sl[0] = 9 } fmt.Printf("%p ", &sl) fmt.Println(sl) } func array_test(arr [5]int)..
시스템 보안 - 운영체제 구조 [1. 운영체제] 정의 컴퓨터 시스템의 자원들을 효율적으로 관리 효과적인 사용을 위한 환경을 제공하는 여러 프로그램의 모임 목적 처리 능력 향상 신뢰성 향상 응답시간 단축 자원 활용률 향상 가용성 향상 주요 자원 관리 기능 프로세스 관리 기억장치 관리 주변장치 관리 파일 관리 분류 Batch processing system Multi programming system Time sharing Multi processing system Realtime system Multi-mode processing Distributed system [2. 프로세스 관리] 프로세스 실행중인 프로그램 PCB 를 갖는 프로그램 스레드 프로세스에서 실행의 개념만을 분리한 개념 실행의 기본 단위 비교 구분 상호 통신 처리 방식 ..
[1316] 그룹 단어 체커 [1. 문제 재정의 및 추상화] 문제에서 정의하는 그룹 단어 => 단어에 존재하는 모든 문자에 대해서 각 문자가 연속해서 나타나는 경우 => kin: k, i, n 이 한번씩 연속해서 나타나므로 그룹 단어 => aabbbccb: b 가 불연속이므로 그룹 단어가 아님 입력으로는 단어의 개수 N 이 맨 처음줄에 있고, 그 밑으로 N 만큼 단어가 주어짐 1 0 { input, _ := r.ReadString('\n') input = strings.TrimRight(input, "\r\n") TC-- count += isGroupWord(input) } fmt.Println(count) }