- Data Science [Causal Inference] 1. Introduction To Causality 인과추론이란 | 심슨의 역설 인과추론이란 무엇인가 Correlation Does not Imply Casationhttps://tylervigen.com/spurious-correlationsSpurious correlationsSpurious correlationstylervigen.com위의 사이트는 가짜 인과관계(spurious-correlations)를 모아놓은 사이트입니다. Nicolas Cage의 영화 수와 익사한 사람의 수의 상관관계 등.. 다양하게 말이 안되는 예시들이 존재합니다. 이렇게 명확하게 가짜 상관관계임을 알기 쉬운 예시도 있지만, 현실에서의 문제는 직관적으로 판단하기 어려운 경우가 많습니다. 비슷한 유저에게 비슷한 상품을 추천해주는 협업필터링 알고리즘의 효과를 측정해 본다고 했을 때, 다음과 같은 질문을 ..
- Data Engineering [opensearch | elasticsearch] maximum shards open 문제 문제 RequestError(400, 'validation_exception', 'Validation Failed: 1: this action would add [2] total shards, but this cluster currently has [999]/[1000] maximum shards open;') 가끔 elasticsearch를 사용할 때 종종 발생했던 문제인데 opensearch를 사용할 때도 또 만나서 정리.. 원인 이 에러는 Elasticsearch /Opensearch 클러스터가 설정된 최대 샤드 개수를 초과하려고 할 때 발생한다. 각 인덱스는 여러개의 샤드로 분할되고, 클러스터 전체에서 허용되는 최대 샤드 수가 설정된다. 현재 1000개의 샤드가 설정되어있고, 999개의 샤드가 열..
- 논문 [논문요약] SCINet: Time Series is a Special Sequence (2021) Introduction There are mainly three kinds of TSF(Time Series Forecasting) methods using deep neural networks. (i) RNNs (ii) Transformer-based model (iii) TCN (temporal convolutional network) Despite the promising results of TSF methods, they do not consider the speciality of time series. In time series sequence, the temporal relations are largely preserved after downsampling into two sub-sequenc..
- MLOps | Infra [k8s] python sdk를 이용해 Pod 내에서 Kubernetes API 사용하기 방법1. config file 사용 config.load_incluster_config() v1 = client.CoreV1Api() pod내부가 아닌 경우엔 load_kube_config() 를 사용하지만 pod내부에서 config file을 로드할 때는 load_incluster_config() 를 사용한다. 방법 1을 사용해도 권한이 없어서 403 errors 가 발생할 수 있다. 이런 경우에 클러스터롤바인딩이 필요하다. 관련 내용은 kubernetes-client github에서 확인할 수 있다. 더보기 Shows how to load a Kubernetes config from within a cluster. This scriptmust be run within a pod. You can sta..
- MLOps | Infra [kubeflow] kfp.dsl을 사용한 pod scheduling node에 기존에 있는 pod 옮기기 kubectl drain worker-1에 실행되고 있던 기존 잡들을 다른 노드로 옮기기위해 drain 명령을 실행합니다. drain 이 실행되면 cordon의 과정이 포함되므로 어떤 파드도 스케줄링되지 않습니다. 다른 node에 pod가 이동하는 것으로 보이지만 실제로는 기존 노드에서 실행되고 있던 파드들을 삭제한 후 다른 노드에서 재생성하는 과정이 진행됩니다. 이때, replica set에 있는 pod들은 다른 노드에서 살아나지만, 그렇지 않은 pod들은 복원되지 못한다는 것에 주의해야합니다. -ignore-daemonsets=true option을 설정하면 데몬세트로 실행한 파드들을 무시하고 드레인 설정을 적용할 수 있습니다. kubectl uncordon 원하..
- MLOps | Infra [k8s] Backup and Restore Methods Backup and Restore Methods Backup Candidates Resource Configuration ETCD Cluster Persistent Volumes Backup - Resource Configuration Resource Configuration의 경우 declarative 한 방식을 사용하는게 configuration을 저장하기 위해 좋다. declarative한 방식을 사용했을 때, 가장 좋은 방식은 yaml을 git에 저장해 버전 관리를 하는 것이다. declarative 한 방식과 imperative한 방식을 모두 사용할 수 있으므로 resource configuration backup을 위한 최선의 방법은 query the API server이다. kubectl g..
- MLOps | Infra [k8s] Cluster Upgrade Process Cluster Upgrade Process cluster upgrade kubernetes components들이 서로 다른 release version을 가질 수 있는데 나머지 components들은 kube-apiserver release verison 보다 클 수 없다. controller manager, scheduler는 kube-apiserver보다 1 version만 낮을 수 있다. kubelet이랑 kube-proxys는 2 version보다 낮을 수 있다. kubetl은 kube-apiserver보다 한 버전이 높거나 낮을 수 있다. 하위 버전을 지원한다는 특성 때문에 live upgrases가 가능하다. k8s는 기본적으로 최신버전 - 3 까지만 지원을 해준다. upgrades는 one..
- MLOps | Infra [k8s] drain and cordon OS Upgrades : cluster의 노드를 유지보수(ex. Security path)를 위해 안정적으로 내리려면 어떻게 해야할까? node를 내리려고 할 때 5분안에 node를 살리면 pod가 실행되지만 5분이 지나면 pod는 terminated 된다. 이것은 kube-controller-manager에서 --pod-eviction-timeout=5m0s이 defalut 값이 5분으로 설정되어 있기 때문이다. pod eviction time이후 노드가 다시 생성되었을 때 replica set에 있는 pod들은 다른 노드에서 살아나지만, 그렇지 않은 pod들은 복원되지 못한다. 만약 노드가 다운되는 시간이 5분 이내일 것으로 예상되면 quick upgrade나 reboot가 가능하지만, 그렇지 않을 ..
- MLOps | Infra [k8s] Multi Container PODs Multi Container PODs WEB Server와 LOG Agent를 함께 동작시켜야한다든지 여러개의 컨테이너를 한번에 실행시켜야하는 경우 Multi-Container Pods를 사용할 수 있다. Multi-Container PODs Design Pattern 파드로 여러 개의 컨테이너를 묶어서 구성하고 실행할 때 몇가지 패턴을 적용할 수 있다. Sidecar pattern 원래 사용하려던 기본 컨테이너의 기능을 확장하거나 강화하는 용도로 컨테이너를 추가하는 것 기본 컨테이너는 원래 목적의 기능에만 충실하도록 구성하고, 나머지 공통 부가 기능들은 사이드카 컨테이너를 추가해서 사용 ex. 웹서버 컨테이너 - 로그 수집 컨테이너(사이드카 역할) 로 설정하면 웹 서버 컨테이너를 다른 역할을 하는 컨테..
- MLOps | Infra [k8s] Application Lifecycle Management Application Commands & Arguments docker image의 entrypoint의 argument는 spec.containers.args에 명시해준다. spec.containers.args는 Docker file의 CMD opiton을 overrride한다. Docker file의 ENTRYPOINT를 override하기 위해서는 spec.containers.commad를 사용한다. Configure Environment Variables in Applications 환경 변수를 설정하기 위해 pod-definition.yaml에서 spec.container.env property를 사용한다. 예시 apiVersion : v1 kind : Pod metadata : name : s..
- MLOps | Infra [k8s] Rolling Updates and Rollbacks Rolling Updates and Rollbacks Deloyment Rollout and Versioning Deployment를 생성하면 rollout이 트리거되면서 새로운 버전의 deployment Revision1이 생성된다. 이후 컨테이너가 업데이트되면 새로운 rollout이 트리거되면서 새로운 버전의 deployment Revision2가 생성된다. 이것은 버전의 변화를 트랙하고, roll back 을 가능하게 한다. Rollout Command kubectl rollout status deployment/myapp-deployment - 히스토리 보기 kubectl rollout history deployment/myapp-deployment Deployment Strategy 1.Recr..
- MLOps | Infra [k8s] Managing Application Logs Managing Application Logs 컨테이너 오케스트레이터를 사용하는 환경에서 로그를 수집할 때 주의해야할 점 중 하나는 특별한 상황을 제외하고는 로그를 로컬 디스크에 파일로 저장하지 않아야 한다. 전통적인 애플리케이션 운영환경에선 로그를 로컬 디스크에 저장하고 일정 시간 이상 저장하거나 일정 용량이 되면 오래된 로그를 삭제한다. -이런 방식은 지정된 장비에서 실행된다는 것을 가정하므로 문제 발생시 로그를 확인해야한다. 컨테이너 오케스트레이터를 사용하는 시스템이면 컨테이너가 상황에 따라 클러스터 안의 여러 노드를 옮겨다니기 때문에 로그를 일일히 확인하는 것이 어렵다. 따라서 어떤 클러스터의 노드 중 어떤 컨테이너가 실행되었는지를 확인해야 로그를 확인할 수 있다. 파드 로그 확인하기 kubect..
- MLOps | Infra [k8s] Monitor Cluster Components Monitor Cluster Components Monitor 쿠버네티스에서 기본적인 시스템 메트릭인 CPU, Memory 부터 클러스터에 노드 수, 컨테이너 상태 등 많은 것을 모니터링 해야한다. 이런 것들을 모니터링하고 metric을 저장하고 분석하기 위한 솔루션이 필요한데 쿠버네티스는 이 모든것들을 제공하지는 않기 때문에 Prometheus, Metrics-Server, ELK, Datadog, Dynatrace같은 오픈소스 솔루션들이 필요하다. Heapster vs Metric Server Heapster는 kubenetes를 모니터링하기 위한 오리지널 프로젝트였지만 현재는 사용되지 않는다. Metric server는 쿠버네티스 모니터링 아키텍처에서 core metric pipeline을 효율적으..
- MLOps | Infra [k8s] Kubernetes Monitoring Architecture Kubernetes Monitoring Architecture : 클러스터의 상태와 클러스터 안에 실행 중인 파드들을 모니터링 하는 방법에 대해 알아보자. system metrics service metrics core metric pipeline monitoring pipeline system metrics 노드나 컨테이너의 CPU, Memory utilization 같은 시스템 관련 메트릭 1.core metrics 쿠버네티스 내부 컴포넌트들이 사용하는 메트릭 현재 클러스터 안이나 내장 오토스케일링에서 사용할 수 있는 자원이 얼마인지 파악 kubectl top command에서 보여주는 cpu/memory 사용량, pod/container의 disk 사용량 등 2.non-core metrics k8s..
- MLOps | Infra [k8s] Multiple Schedulers Multiple Schedulers node에 pod를 스케줄링하기 전에 custom condition을 체크하는 자체적인 스케줄링 알고리즘을 만들고 싶을 경우 default scheduler에 스케줄 프로그램을 deploy하거나 추가적인 scheduler를 쿠버네티스 클러스터에 추가할 수 있음 애플리케이션 마다 다른 스케줄러를 이용할 수 있다. 예를들어, 다른 app은 default를 사용하게하고, 특정 app은 custom scheduler를 사용할 수 있다. pod를 생성할 때 어떤 스케줄러를 사용할지 정의할 수 있다. Deploy Additional Scheduler kube-scheuler binary를 다운로드 받은 후 옵션과 함께 서비스로 실행한다. additional scheduler를 d..
- MLOps | Infra [k8s] static pod Static pod 스태틱 파드란? kube-apiserver를 통하지 않고 kubelet이 직접 실행하는 파드 kubelet이 직접 관리하고, 이상이 생기면 재시작 지정한 디렉터리에서 yaml파일들을 kubelet이 읽고 파드를 생성하고, 계속 파드가 유지되도록 관리함 파드만 생성할 수 있고, replica나 deployment는 생성 못함 kubelet은 오직 pod level에서만 작동 kubelet이 실행중인 노드에서만 실행되고 다른 노드에서는 실행되지 않음 kube-apiserver는 조회는 할 수 있지만 스태틱파드에 어떤 명령을 실행할 수는 없음 kubectl get pods 명령어로 static pod도 조회 가능 kbuelet이 pod를 생성하면 kube-apiserver가 mirror o..
- 논문 [논문요약] DLinear, NLinear ( LTSF-Linear ) 리뷰 Are Transformers Effective for Time Series Forecasting? Abstract 원문 바로가기 논문은 다음과 같은 질문에서 시작합니다. 시계열 예측에 Transformer기반 모형을 적용하는게 정말 효과적일까? transformer를 활용한 LTSF(long-term series forecasting)에 관현 연구가 지난 몇년 간 좋은 성과를 보였습니다. transforemr는 긴 시퀀스 사이에 semantic(의미론적) 상관관계를 추출하는데 가장 성공적인 방법인 것은 맞지만, 시간적 관계를 추출해야하는 시계열 예측 모델링에선 아래와 같은 이유로 단점이 존재합니다. transformer가 순서가 있는 정보를 저장하는 것을 가능하게 하기 위해 positional enco..
- 카테고리 없음 구글드라이브에 있는 문서 서버로 옮기기 cd datasets gdown https://drive.google.com/drive/folders/1KFFJkYybPNqKOH3rAyzKmE2H7Ih_ypRU -O /tmp/folder --folder cd ..
- Data Engineering [elasticsearch] elasticsearch 10000개 이상 데이터 조회 python es에서 데이터를 10000개 이상 조회하려면 scroll id를 사용하거나 elasticsearch helpers의 scan 을 사용해야한다. helpers.scan elasticsearch.helpers.scan(conn, scroll='10m', index=index, doc_type='_doc', size=10000, query=query) es.scroll def scroll_API(index, body): result = [] _KEEP_ALIVE_LIMIT='30s' # Initialize the scroll page = es.search(index=index ,body=body ,scroll=_KEEP_ALIVE_LIMIT ,size=10000 ,track_total_hits=True ) ..
- 논문 [논문 요약] Utilization Prediction Aware VM Consolidation Approach for Green Cloud Computing Abstract VM consolidation은 엄격한 NP-hard 문제이고, 많은 휴리스틱 알고리즘이 제안됨 기존의 문제 원인 대부분의 솔루션은 현재 리소스 기반으로 호스트의 수를 최소화하는 것만을 담는다. 미래에 리소스에 대한 탐구 x 문제 상황 불필요한 마이그레이션과 SLA위반이 증가. 논문의 해결책 bin-packing으로 공식화된 알고리즘에 현재와 미래의 리소스 사용량을 고려한다. 미래 리소스 예측엔 k-nearest neighbor regression 모델을 사용 실험 결과 VM과 호스트 리소스 예측의 효과를 실제 워크로드 추적을 사용해 조사한 결과 energy consumption, VM migration 수, SLA 위반 수가 줄어드는 것을 알 수 있음 keyword Dynamic VM ..
- Data Engineering [Docker] Docker Compose로 Django 프로젝트 세팅 프로젝트 컴포넌트 정의 프로젝트를 시작하기위해 Dockerfile, python dependencies파일, docker-compoes.yml파일이 필요하다. Dockerfile 먼저, 디렉토리에 Dockerfile을 생성한다. # syntax=docker/dockerfile:1 FROM python:3 ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 WORKDIR /code # 작업 디렉토리를 code로 변경 COPY . . # 현재 디렉터리의 모든 파일 이미지를 작업 디렉터리로 복사 RUN pip install -r requirements.txt COPY . /code/ 이 도커 파일은 파이썬3 Parent 이미지를 시작한다. 부모 이미지는 src라는 새..
- Data Engineering [PostgreSQL] macOS에 PostgreSQL 설치 및 설정 설치 설치전 brew에 postgresql을 검색해본다. brew search postgresql 기본 버전으로 설치를 시작한다. brew install postgresql 서비스 시작 brew services start postgresql postgres -V 설정 사용자 권한 계정 설정 먼저, postgre에 접속한다. psql postgres 아래의 명령어로 role 리스트를 확인 할 수 있다. postgre는 설치시 자동으로 계정을 생성해준다. postgres=# \du 권한을 설정해주기 전에, 기본으로 생성된 슈퍼유저의 비밀번호를 설정한다. postgres=# \password postgres 데이터 베이스 생성 테스트 데이터 베이스를 생성해봅니다. create database testdb; ..
- Data Engineering [ELK] elastic stack 이란 / 개념 / 구성 요소 / 용도 ELK 란? ELK stack이란 Elasticsearch Logstash Kibana 세가지 오픈소스 프로젝트의 이니셜을 합쳐 만든 말이다. 등장 배경 루씬 기반 검색엔진인 elasticsearch는 단순 검색 엔진에 머무르는 대신 플랫폼으로 발전해 elk stack으로 발전했다. 기존의 검색엔진은 빅데이터 파이프라인을 구성하고, 유연성을 확보하기 위해서 오픈소스를 조합해야하는 불편함이 있었지만, elk stack은 일반적인 빅데이터 파이프라인을 구성하기 위한 데이터 수집, 가공, 저장 분석, 시각화에 필요한 모든 소프트웨어를 갖추고 있다. ELK 구성 요소 Beats, Logstash : 데이터를 수집하고 가공 Elasticsearch : 데이터 저장 및 분석 Kibana : 시각화 및 모니터링 El..
- MLOps | Infra [kubernetes] 쿠버네티스 클러스터를 구성하는 도구 - Kubeadm, Kuberspray 쿠버네티스 클러스터를 구성하는 도구 Kubeadm 쿠버네티스에서 공식 제공하는 클러스터 생성 관리 도구 초기에는 고가용성을 갖춘 클러스터 구성이 어려워 테스트용으로 사용했지만 최근에는 점점 발전해 고가용성을 제공하는 클러스터 구성 가능 cf) 고가용성 High Availability: 서버와 네트워크, 프로그램 등의 정보 시스템이 상당히 오랜 기간 지속적으로 정상 운영이 가능한 성질 Kubeadm에서 제공하는 클러스터 고가용성 구조 Kubespray 상용 서비스에 적합한 보안성과 고가용성이 있는 쿠버네티스 클러스터를 배포하는 오픈 소스 프로젝트 서버 환경 설정 자동화 도구인 앤서블 기반으로 개발 설정에 따라 다양한 형식의 클러스터 구성 가능 -> 온프레미스 환경에서 유용 Kuberspray에서 제공하는 ..
- MLOps | Infra [kubernetes] 쿠버네티스 설치 - Kubespray 사용하기 Kubespray 사용 GCP를 사용하여 실습 환경을 구성하였다. VM인스턴스를 만든다. Compute Engine에 접속하여 VM인스턴스를 누른 후 [인스턴스 만들기]를 선택해 가상머신 인스턴스 5개를 만든다. 3개는 마스터로 사용하고, 2개는 워크노드로 사용하기 위함이다. 가용성을 위해 마스터노드를 보통 3개 정도 사용한다고한다. 1. SSH 키 생성과 배포 - 마스터 노드인 instance - 1 서버에서 다른 원격 접속(SSH)이 가능하도록 설정 인스턴스 목록에서 를 누르면 해당 서버에 SSH로 접속할 수 있다. RSA방식으로 암호화 키를 만들겠다는 옵션을 주면서 SSH키를 생성하는 명령어는 다음과 같다. ssh-keygen -t rsa ls -al .ssh/ .ssh 디렉터리 안에 id_rsa..
- BaekJoon [백준 5557] 1학년 python 문제 풀이 이 문제는 DP로 풀어야한다. 어떤 구조로 정보가 저장될 수 있을지 살펴보면 왜 DP로 풀어야하는지 시각적으로 알 수 있다. 0부터 20사이의 숫자만 나와야하므로 DP는 크기가 21인 배열(0포함)을 사용할 수 있다. 21개의 배열에 루프를 돌며 다음 값을 + - 해서 다음 배열에 저장해주면 된다. 이때 상근이는 20을 넘는 수는 모른다는 조건이 있으므로 배열을 넘어가는 수는 저장하지 않는다. 이를 코드로 구현하면 아래와 같다. 통과된 풀이 import sys n = int(input()) arr = list(map(int, sys.stdin.readline().split())) dp = [[0] * 21 for _ in range(n)] # 첫 번째 수는 무조건 저장해야하니까 dp[0][ar..
- Programmers [Programmers] 가장 큰 수 python (정렬) 문제 문제 설명 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요. 제한 사항 numbers의 길이는 1 이상 100,000 이하입니다. numbers의 원소는 0 이상 1,000 이하입니다. 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다. 입출력 예 접근 방법 빈 문자열로 수를 초기화 ..
- Programmers [Programmers] 체육복 python (Greedy) 문제 문제 설명 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution ..
- Programmers [Programmers] 완주하지 못한 선수 python (Hash) 문제 문제 설명 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요. 제한 사항 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. completion의 길이는 participant의 길이보다 1 작습니다. 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다. 참가자 중에는 동명이인이 있을 수 있습니다. 입출력 예 입출력 예 설명 예제 #1 "leo"는 참여자 명단에는 있지만, 완주..
- 이론 정리 [Algorithm] 가장 간단한 알고리즘 - 브루트 포스법 브루트 포스법 : brutu는 무식한, force는 힘이라는 뜻이다. 무식하게 힘으로 해결하는 방법. 즉, 가장 간단한 알고리즘으로 가능한 모든 경우의 수를 검사하는 알고리즘이다. 브루트 포스법은 문자열 검색 중 가장 가장 기초적이고 단순한 알고리즘이다. 문자열 검색 string searching 이란 ? : 어떤 문자열 안에 다른 문자열이 포함되어 있는지 검사하고, 만약 포함되어 있다면 어디에 위치하는지 찾아내는 것. 텍스트 text : 검색되는 쪽의 문자열 패턴 pattern : 찾아내는 문자열 ex. 문자열 'yena'에서 'na'를 검색하면 성공, 'bibi'에서 'na'를 검색하면 실패. 여기서 텍스트는 'yena', 'jiyun'이 되고, 패턴은 'na'가 된다. 브루트 포스법 brute fo..
- Python [python] 문자열 관련 함수 정리 파이썬에서 문자열을 다룰 때 사용할 수 있는 함수들을 정리해보려고 한다. 멤버십 연산자 먼저, 가장 기본이되는 멤버십 연산자 membership operator를 사용해 문자열을 검색 할 수 있다. 'na' in 'yena' # yena에 na가 포함 o 인지 ? 'na' not in 'yena' # yena에 na가 포함 x 인지? pattern이 text에 포함되어있는지 boolean 값으로 반환한다. find, index 계열 함수 str클래스에 소속된 find(), rfind(), index(), rindex()를 이용하여 문자열을 검색할 수 있다. find() text = 'yenana' pattern = 'na' start = 0 # 시작 인덱스 end = len(text) # 시퀀스의 길이 ..
- Python [Python] sys.setrecursionlimit() - 재귀 최대 깊이 설정 재귀 - sys.setrecursionlimit import sys sys.setrecursionlimit(10 ** 6) 재귀를 사용해서 문제를 풀 때 위 코드를 상단에 필수로 써주어야한다 !! 파이썬의 기본 재귀 깊이 제한은 1000회 이기 때문에 재귀 문제를 풀 때 런타임 에러가 발생할 수 있다. 특히, 코딩테스트 환경에서는 이런 에러 메시지를 볼 수 없으므로 코드의 상단에 sys.setrecursionlimit(10**6)을 작성해주면 재귀의 최대 깊이가 10**6으로 설정된다. 주의 : PyPy에서는 sys.setrecursionlimit()로 재귀의 깊이를 설정할 수 없다고 한다.
- BaekJoon [백준 12904] A와 B python 문제 문자열 S, T가 주어질 때 2가지 규칙에 의해 S를 T로 변경할 수 있는지 출력하는 문제이다. 풀이 기본 아이디어 S의 길이 마지막 문자열이 A라면 A를 제거한다. 문자열을 뒤집고 뒤에 B를 추가한다. -> 마지막 문자열이 B라면 B를 제거하고, 문자열을 뒤집는다. 파이썬 구현 문자열을 뒤집고, 마지막 문자열을 제거하는 동작을 해야하므로 리스트 이용 통과된 풀이 s = list(input()) # 문자열 S t = list(input()) # 문자열 t success = False while len(s) != len(t): if t[-1] == 'A': # 규칙 1 t.pop() elif t[-1] == 'B': # 규칙 2 t.pop() t = t[::-1] if s == t: # 성공 여부 체..
- 이론 정리 [Algorithm] 재귀 Recursion 재귀 recursion 재귀 알고리즘의 기본 재귀란 ? 어떠한 이벤트에서 자기 자신을 포함하고 다시 자기 자신을 사용하여 정의되는 경우 재귀를 사용하면 프로그램을 간결하고 효율성 좋게 작성할 수 있음 재귀 호출 recursive call '자기 자신과 똑같은 함수'를 호출한다. ex - 팩토리얼 구하기 factorial() 함수는 n - 1의 팩토리얼 값을 구하기 위해 다시 자기 자신과 똑같은 factorial() 함수를 호출한다. def factorial(n: int) -> int: """양의 정수 n의 팩토리얼을 구하는 과정""" if n > 0: return n * factorial(n - 1) else: return 1 if __name__ == '__main__': n = int(input('출..
- Data Science [kaggle] Kaggle API 사용하기 mac 1. 아나콘다에 Kaggle 패키지 설치 conda install -c conda-forge kaggle conda install kaggle 2. Kaggle 사용자 토큰 받기 Account에 가서 create API Toke을 클릭하면 kaggle.json파일이 다운로드 된다. 3. kaggle.json mkdir -p ~/.kaggle mv kaggle.json ~/.kaggle/kaggle.json .kaggle이라는 폴더를 생성해준 후 다운받은 json 파일을 이동시킨다. 4. 동작 확인 kaggle competitions list 캐글에서 현재 진행되고 있는 경진대회 목록을 보여준다. 5. 원하는 데이터 다운받기 먼저 다운받을 수 있는 데이터 리스트를 확인한다. kaggle datasets l..
- BaekJoon [백준 9020] 골드바흐의 추측 python 문제 문제 요약 : 모든 짝수를 두 소수의 합으로 나눌 수 있다는 골드바흐의 추측에 맞게 주어진 짝수 n에 대하여 골드바흐 파티션을 출력하는 문제이다. 풀이 기본 아이디어 : n을 반으로 나눈 다음 n에서 반으로 나눈 수와 가까운 소수를 뺐을 때 나머지가가 소수이면 골드바흐 파티션이 된 것 ! 소수인지 판별 에레토스테스테네스의 체 사용 ( 백준 1929 번 ) 루프 사용 반복 변수 : tmp , n//2 부터 시작 반복 변수 갱신 : 0이 되기 전 까지 -1 종료 조건 : n- tmp 했을 때 소수가 나온다. 반(n // 2) 만 체크하는 이유 가장 차이가 적은 파티션을 찾아야 하니까. 0부터 (n // 2)까지 반만 체크해도 n-tmp가 소수인지 체크하기 때문에 결국 0부터 n까지 전체가 다 체크되니까..
- 이론 정리 [Algorithm] 탐색 Searching 탐색 범위를 반씩 좁혀가는 탐색 순차 탐색 Sequential Search : 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법 보통 정렬되지 않은 리스트에서 데이터를 찾아야 할 때 사용 리스트 내에 데이터가 아무리 많아도 시간만 충분하다면 항상 원하는 데이터를 찾을 수 있음. 순차 탐색 소스코드 # 순차 탐색 소스코드 구현 def sequential_search(n, target, array): # 각 원소를 하나씩 확인하며 for i in range(n): # 현재의 원소가 찾고자 하는 원소와 동일한 경우 if array[i] == target: return i + 1 # 현재의 위치 반환(인덱스는 0부터 시작하므로 1 더하기) print("생성할 원소 개..
- 이론 정리 [Algorithm] 정렬 Sorting 정렬 sorting : 데이터를 특정한 기준에 따라서 순서대로 나열하는 것. 정렬 알고리즘으로 데이터를 정렬하면 이진 탐색 Binary Search가 가능해진다. 정렬은 이진탐색의 전처리 과정이기도 하다. '알고리즘의 효율성' 측면에서 정렬은 중요하다. 선택 정렬 selection sort : 매번 '가장 작은 것을 선택'한다. 데이터가 무작위로 여러 개 있을 때, 이 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸고, 그 다음 작은 데이터를 선택해 앞에서 두 번째 데이터와 바꾸는 과정을 반복한다. 선택 정렬은 가장 작은 데이터를 앞으로 보내는 과정을 N-1번 반복하여 정렬이 완료되는 것을 알 수 있다. 스와프(Swap): 특정한 리스트가 주어졌을 때 두 변수의 위치를 변경하는 작업. 파이..
- 이론 정리 [Algorithm] 복잡도 Complexity 복잡도 복잡도는 알고리즘의 성능을 나타내는 척도이다. 동일한 기능을 수행하는 알고리즘이 있다면 복잡도가 낮을수록 좋은 알고리즘이다. 시간 복잡도 : 알고리즘을 위해 필요한 연산의 횟수 공간 복잡도 : 알고리즘을 위해 필요한 메모리의 양 일반적으로 코딩 테스트에서는 최악의 경우에 대한 연산 횟수가 중요하다. 따라서 최악의 경우의 시간 복잡도를 우선적으로 고려해야한다. Cf) Memorization 메모이제이션 : 메모리를 더 많이 사용해서 시간을 비약적으로 줄이는 방법 시간 복잡도와 공간 복잡도의 Trade-off 메모리를 많이 사용하는 대신에 반복되는 연산을 생략하거나 더 많은 정보를 관리하면서 계산의 복잡도를 줄일 수 있다. 이때 메모리를 더 소모하는 대신에 얻을 수 있는 시간적 이점이 매우 큰 경우가..
- 이론 정리 [Algorithm] 알고리즘 설계와 분석의 기초 알고리즘 설계와 분석의 기초 알고리즘이란 문제를 해결하기 위한 단계적 절차를 말한다. 어떤 작업을 수행하기 위해 입력을 받아 원하는 출력을 만들어내는 과정을 기술한 것이다. 점근적 분석 점근적 분석이란 입력이 충분히 큰 경우에 대한 분석을 말한다. 컴퓨터는 빠른 처리 능력을 가지므로 입력의 크기가 작을땐 속도의 차이가 뚜렷하지 않다. 하지만, 충분히 큰 입력에서는 알고리즘의 효율성에 따라 수행 시간이 크게 차이가 날 수 있다. 좋은 알고리즘 = 성능이 좋은 = 효율적인 = 같은 시간에서 더 빠른 알고리즘이다. 알고리즘 표현법 순서도를 이용한 표현 여러 종류의 상자와 상자를 이어 주는 화살표를 이용해서 명령 순서를 표현 간단한 알고리즘은 쉽게 표현할 수 있지만, 복잡한 알고리즘은 표현하기 어려운 경우가 많..