글쓰는 또라이가 세상을 바꾼다 - 글또 제 블로그에 오신 모든 분들 안녕하세요. 이번 7월부터 내년 1월까지 글또(글쓰는 또라이가 세상을 바꾼다)모임에 참여하여 활동하게 되었습니다. 첫 번째 글은 글또를 모르시는 분들을 위해서 글또가 어떤 모임인지 그리고 글또를 하게 된 이유, 어떤 글을 쓸지에 대해서 써보려고 합니다. 글또란? 글또는 글 쓰는 또라이가 세상을 바꾼다의 약자로 블로그에 글을 쓰고, 서로 피드백을 해주면서 개발자들의 글쓰기 역량을 키우고, 글을 꾸준히 쓸 수 있게 도와주는 모임입니다. 글또는 2018년부터 시작해서 현재는 6기수가 진행되고 있습니다. 1기에는 13명으로 시작했지만, 현재 약 130명의 개발자분이 참여하고 있습니다. 매 기수를 거쳐오면서 글또는 슬랙에서 채널별로 다양한 활동,..
백준 11727번 2xn 타일링 2 백준 11727번 2xn 타일링 2 설명 타일로 채우는 경우의 수가 크게 3가지가 있다. n일 때 타일을 채우는 방법의 수를 f(n)이라고 하면, f(n-1)에서 2x1 타일 1개를 놓는 경우 f(n-2)에서 1x2 타일 2개를 놓는 경우 f(n-2)에서 2x2 타일 1개를 놓는 경우 f(n-2)에서 2x1 2개를 놓는 경우를 생각 할 수도 있지만, f(n-1)에서 2x1 타일 1개를 놓는 경우와 겹친다. 코드 import sys, collections input = sys.stdin.readline class Solution: def tiling(self, n: int): dp = collections.defaultdict(int) dp[1], dp[2] = 1, 3..
백준 10844번 쉬운 계단 수 백준 10844번 쉬운 계단 수 설명 단순히 점화식을 찾으려고 하면 너무 복잡해진다. 2차원 배열에서의 점화 관계를 사용한다. 위 행렬을 A라고 할 때, A[i][j]는 j로 끝나는 i자리수의 계단의 수이다. 1자리수는 1~9까지 올 수 있으므로 그대로 dp를 채울 수 있고, 2자리수 부터는 0은 전자리수의 1인 경우와 9는 전자리수의 8일 경우이고 나머지는 전자리수의 하나적고 많은 경우의 합이다. 즉 점화식을 dp 배열로 표현하게되면 밑의 코드라고 볼 수 있다. dp[i][0] = dp[i-1][1] dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] dp[i][9] = dp[i-1][8] 코드 import sys input = sys.stdin.rea..
디플로이먼트(Deployment): 레플리카셋, 포드의 배포를 관리 디플로이먼트 사용하기 실제 쿠버네티스 운영 환경에서 레플리카셋을 YAML 파일에서 사용하는 경우는 거의 없고, 대부분 레플리카셋과 포드의 정보를 정의하는 디플로이먼트(Deployment)라는 이름의 오브젝트를 YAML 파일에 정의해 사용한다. 디플로이먼트는 레플리카셋의 상위 오브젝트이기 때문에 디플로이먼트를 생성하면 해당 디플로이먼트에 대응하는 레플리카셋도 함께 생성된다. # vi deployment-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx-deployment spec: replicas: 3 selector: matchLabels: app: my-n..
레플리카셋(Replica Set): 일정 개수의 포드를 유지하는 컨트롤러 레플리카셋을 사용하는 이유 쿠버네티스의 기본 단위인 포드는 여러 개의 컨테이너를 추상화해 하나의 애플리케이션으로 동작하도록 만드는 컨테이너 묶음이다. 실제로 외부 사용자의 요청을 처리해야 하는 마이크로 서비스 구조의 포드라면 스웜 모드처럼 여러 개의 동일한 컨테이너를 생성한 뒤 외부 요청이 각 컨테이너에 적절히 분배될 수 있어야 한다. 쿠버네티스에서는 기본 단위가 포드이기 때문에 동일한 여러 개의 포드를 생성해 외부 요청을 각 포드에 분배하는 방식을 사용해야 한다. apiVersion: v1 kind: Pod metadata: name: my-nginx-pod-a spec: containers: - name: my-nginx-con..
참고 : API Gateway + lambda로 REST API 만들기(GET) 참고 : API Gateway + lambda로 REST API 만들기(POST) REST API(POST)를 만든 lambda 함수에서 다른 lambda 함수를 호출해 post로 온 값을 보내고, 그 lambda 함수에 pymysql 모듈을 import해서 데이터베이스에 요청 값을 넣어봅시다. lambda 함수에서 lambda 함수 호출 GET, POST 요청 글을 참고해서 람다함수 test2를 만든다. 기존에 쓰던 test 람다함수에서 test2 람다함수를 호출하기위해서 test 람다함수의 추가적인 권한이 필요하다. 이 포스팅에 IAM 역할에서 Lambda_Fullaccess 권한을 가진 역할을 만들어서 처음 람다함수 만..
백준 1068번 트리 백준 1068번 트리 설명 부모노드의 리스트, 지울 노드로 dfs를 호출한다. 지울 노드 값의 부모 리스트를 -2로 바꾸고 부모 리스트를 돌면서 지울노드가 있는지 찾는다. 있으면 지울 노드의 자식 노드들이 있다는 말이기 때문에 그 값을 지울 노드로 해서 dfs를 호출해서 그 값을 -2로 바꿔준다. 이렇게 하면 지울노드와 그 자식노드 모두다 그 위치에 부모노드 리스트에 -2가 박힌다. 그 다음 부모 노드 리스트 인덱스로 쭈욱 돌면서 그 값이 -2가 아니고, 인덱스가 부모리스트에 아에 없는 값이 있으면 count를 1 증가 시키고, count가 정답 인덱스가 부모 리스트에 없으면 그 인덱스를 부모로 가지는 자식이 없다는 말이기 때문에 그 인덱스는 리프노드임 코드 import sys fr..
AWS API Gateway에 API키 등록하기 만든 API에 아무나 접근을 하지 못하도록 키 값을 넣어 암호화 할 수 있다. post요청글에서 만든 REST API에 API키를 등록해보자. 메서드 실행의 설정쪽에서 API 키가 필요함을 True로 바꿔준다. 다음으로 API키를 만들고, 사용량 계획과 연결하는 형태이다. API키, 사용량 계획을 만들어야한다. 먼저 API키를 하나 생성하자. 사용량 계획을 만든다. 만들면서 API를 배포했을 때 스테이지를 연결하고, API 키도 연결한다. 그리고 API를 다시 배포해준다. 키 값을 확인하고, postman으로 post요청을 테스트해보자(post글 참고). 키 값을 적지 않고 그냥 요청했을 때는 message forbidden이 뜨고, 값을 확인 할 수 없다..
AWS API Gateway, Lambda로 post 요청 만들기(REST API) get 요청 만드는 포스팅을 참고해서 API Gateway와 Lambda를 만든다. lambda 함수 import json def lambda_handler(event, context): """post 요청으로 들어온 값들이 body-json으로 묵여 있고, 전체를 body 변수에 저장(통합요청에 매핑 템플릿을 보면 body-json이 있음)""" body = event['body-json'] # TODO implement return { 'success': True, 'data': { # 거기서 star를 가지고옴 'star': body['star'] } } 통합 요청 → 매핑 템플릿 통합 요청에서 매핑 템플릿을 위에 ..
백준 1005번 ACM Craft 백준 1005번 ACM Craft 설명 진입 차수 배열을 만들어서 해당 건물 전에 미리 지어야 할 건물이 있으면 해당 건물을 인덱스로해서 배열의 값을 1씩 증가시킨다. 각 건물마다 지을 때까지 걸리는 시간을 넣기위한 배열 dp를 만든다. 맨 처음에 진입 차수가 0인 건물을 큐에 다 집어 넣고, 그러면서 동시에 해당 건물의 dp 값도 해당 건물을 짓는데 걸리는 시간으로 다 바꿔준다(진입 차수가 0이니깐 그냥 그 해당 건물을 바로 지을 수 있음). 큐를 왼쪽부터 하나씩 빼면서 그 건물 다음으로 지을 수 있는 건물을 확인하면서 진입 차수를 1씩 빼준다. (다음 지을 수 있는 건물의 dp 값)과 (바로 전건물의 dp + 다음 지을 수 있는 건물 건설시간) 이 둘을 비교해서 더 ..
API Gateway, AWS Lambda REST API GET 요청 만들기(2가지) AWS API Gateway, Lambda를 사용해서 GET 요청을 Lambda 함수 내부로 가져오는 예제를 해보자. GET 방식에서 파라미터를 넘길 때는 파라미터가 끝에 쿼리 스트링으로 있는 경우와 url 중간에 존재하는 경우 크게 2가지로 나눌 수 있다. /cafes?latitude=x&longitude=x 카페의 위도, 경도를 쿼리 스트링으로 넘겨줌 /cafes/123142/reviews 숫자는 ID → cafe ID에 따라 까페의 리뷰들을 요청 url 맨끝에 쿼리 스트링으로 넘겨주는 경우 API Gateway 서비스로가서 API 생성 → REST API(프라이빗 x)로 간 뒤에 위에 화면처름 이름, 유형등을 적..
API Gateway Amazon API Gateway Amazon API Gateway는 사용자가 쉽게 API를 생성, 게시, 관리, 모니터링, 보안까지 관리가 가능한 완전관리형 서비스이다. Amazon API Gateway는 트래픽 관리, CORS 지원, 권한 부여 및 액세스 제어, 제한 모니터링 및 API 버전 관리 등 최대 수십만 개의 동시 API 호출을 수신 및 처리하는 데 관계된 모든 작업을 처리한다. 선택 옵션으로는 REST API, WebSocket API, HTTP API가 있다. REST API REST는 'Representational State Transfer'의 약자이다. (대표적인 상태 전달) REST API 특징 클라이언트/서버 REST 서버는 API를 제공하고 이를 클라이언트..
권한관리 AWS IAM IAM(AWS Identity and Access Management)은 AWS의 권한을 관리하는 서비스. 처음 AWS에 계정을 이메일로 생성하면 모든 서비스에 접근할 수 있는 SSO(Single Sign-ON) ID가 생성되고 이를 루트 권한이라고 한다. 사내에서 AWS를 이용하고자 하는 경우에 각자의 부서/팀별로 계정을 생성하여 부여한다. 이때 IAM을 이용하여 필요한 권한을 세분화하여 Role을 부여함으로써 불필요한 접근을 막을 수 있다. IAM에서는 AWS 계정 인증에 MFA(Multi Factor Authentication)를 지원한다. 여기서 펙터란 사용자의 신원을 확인하는 방법에 따라서 지식 기반, 소유 기반, 속성 기반의 인증으로 총 3가지 방법으로 나누어 지는데, ..
서버리스 Cloud Native Patterns Legacy : 인프라부터 애플리케이션까지 구축 IaaS : 하드웨어와 가상화 OS 등 인프라 요소를 서비스로 제공(EC2) Caas : 서비스 형태로 제공되는 컨테이너를 호라용하여 배포(ECS) Paas : 애플리케이션 개발에 집중할 수 있도록 인프라와 런타임 환경을 제공(Elastic Beanstalk) FaaS : 실행할 함수코드만 구현(Lambda) Saas : 제공되는 소프트웨어 사용(Gmail) 서버리스의 형태 Baas(Backend as a Service) Faas(Function as a Service) Baas는 그동안 개발자가 직접 구현하던 백엔드의 부분부분을 서비스로 제공받는 것(Auth0, AWS Cognito, Firebase). F..
백준 1520번 내리막 길 백준 1520번 내리막 길 그냥 탐색으로 풀면 시간초과가 난다.. 그래서 dp 기법을 추가로 사용해야한다. 탐색해서 결과가 나오면 그걸 dp에 저장하고 다른 탐색 때 사용한다..흠.. 코드 import sys, heapq from typing import List input = sys.stdin.readline sys.setrecursionlimit(10**6) class Solution: def down_hill(self, M: int, N: int, graph: List[List[int]]): """dfs로 탐색을 하고 dp기법을 사용하여 배열에 각 칸마다의 결과 값을 저장해나가면서 이전에 갔었던 칸을 지나갈시에 dp에서 답을 가져와서 사용함으로써 깊이 탐색의 시간을 줄인다..
백준 1766번 문제집 백준 1766번 문제집 위상정렬을 사용한다.. 조건이 있는 문제의 번호들중 뒤쪽에 와야 되는 번호들에 차수를 계속해서 매긴뒤에, 아닌 번호들을 먼저 최소 힙에 다 넣고, 힙의 원소들을 빼면서 그 문제번호보다 뒤쪽에 와야하는 문제의 번호 차수를 1씩 차감하면서 0이되어야지 heap에 추가 시킨다. 차수가 0이 아니면 heap에 아직 현재 차감하고 있는 차수의 원소보다 더 빨리 풀어야하는 문제가 있기 때문에 최소 힙에 넣으면 안된다. 코드 import sys, collections, heapq from typing import List input = sys.stdin.readline class Solution: def workbook(self, N: int, M: int, check:..
백준 1167번 트리의 지름 백준 1167번 트리의 지름 아무점을 잡고 dfs로 가장 거리가 먼 정점을 찾는다. 이 정점을 기준으로 다시 dfs로 가장 먼 거리를 찾는다. 코드 from typing import List, Tuple import sys import collections input = sys.stdin.readline sys.setrecursionlimit(10**6) class Solution: def diameter(self, V: int, graph: List[List[Tuple]]): def dfs(u, count): visited[u] = True for v, w in graph[u]: if not visited[v]: vertex, weight = dfs(v, count+w) i..
백준 11779번 최소 비용 구하기 2 백준 11779번 최소 비용 구하기 2 경로와 비용을 defaultdict로 따로 만들어줬다. 두번째 코드는 왜 틀리는지 모르겠다..ㅠㅠ 코드 import sys import collections import heapq import copy from typing import List, Tuple input = sys.stdin.readline class Solution: def min_cost(self, start: int, end: int, g: List[List[Tuple]]): Q = [] heapq.heappush(Q, (0, start)) # 경로 저장 path = collections.defaultdict(list) # 비용 dist = [sys.maxs..