일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- jwt 표준
- 카카오
- prg 패턴
- 결제서비스
- 수신자 대상 다르게
- piplining
- 트랜잭샨
- spring event
- 레디스 동시성
- branch 전략
- 검색어 추천
- 깊게 생각해보기
- 디버깅
- 구현
- 숫자 블록
- AWS
- 완전탐색
- 이분탐색
- BFS
- 누적합
- 쿠키
- 좋은 코드 나쁜 코드
- docker
- 코드 계약
- 셀러리
- 백준
- 프로그래머스
- gRPC
- 객체지향패러다임
- 알람 시스템
- Today
- Total
목록개발 (111)
코딩관계론
문제 이해하기 등굣길 경로의 경우의 수를 구하는 문제이다. 좌표 (1,1)인 집에서 부터 (m,n)인 학교까지 가는 경로를 구하는 문제인데 사이에 웅덩이를 피해 가야한다. 경우의 수를 계산해보면 200!/(100! * 100!)이 된다. 매우 큰 수이기 때문에 완전탐색으로는 제한시간안에 답을 찾을 수 없다. https://m.blog.naver.com/parkhc1992/220669287080 [확률과 통계] 최단거리 경우의수 중2때 배운적이 있을거에요. 최단거리 경우의수 구하는 문제 예를 들면 이런 그림 하나주고 점A에서 점B... blog.naver.com 문제 해결 방법 설명하기 1. 최단거리 구하는 수 계산하기 최단 거리를 구하는 경우의 수는 아래의 그림과 같다. 이를 코드로 구현하면 아래와 같다..
문제 이해하기 주어진 피로도(K)를 사용해서 최대한 많은 던전을 탐험하는 문제였다. 던전의 최대 개수가 8개이니 가장 연산이 많은 경우의 수는 65,536이다, 따라서 완전탐색을 사용하면 시간안에 풀 수 있다. 문제 해결 방법 설명하기 1. 모든 경우의 수를 탐색 아래의 코드를 보면 visited 배열을 사용해 던전의 방문 유무를 확인하고, 해당 던전의 피로도 조건을 만족한다면 일단 던전에 입장해서 탐색을 진행한다. 이 방법을 사용하면 모든 경우의 수를 탐색할 수 있다. def search(k, dungeons, visited): ans = 0 for i in range(len(dungeons)): if visited[i] == False and dungeons[i][0]
문제 이해하기 아래의 그림과 같이 게임 보드와 테이블이 주어지는데 테이블의 블럭들을 사용해서 게임보드에 최대한 채워넣어주면 된다. 단 테이블에 있는 블록을 게임보드에 채워 넣을 땐 주위에 빈 칸이 있으면 안된다는 몇 가지의 조건을이 존재합니다. 문제 해결 방법 설명하기 1. 테이블에서 블럭의 모양을 추출한 후 roate 배열을 저장 블럭들의 회전 배열을 만들기 위해선 블럭의 모양을 알아야 합니다. 이를 위해서 저는 BFS를 사용해 블럭들을 상대좌표로 변환했습니다. 코드를 보면 연결된 블록을 찾기 위해서 절대좌표를 사용해 BFS탐색을 진행합니다. 만약 인접한 블록이 발견됐다면 해당 좌표를 상대 좌표로 변환해줍니다. def bfs(x, y, board, visited, choice = 0): queue = ..
문제 이해하기 주어진 지형에서 아이템을 줍기위한 최단 거리를 구해야 한다. 제한사항은 가장 바깥쪽 테투리만을 이용해 캐릭터를 이동시켜야 한다는 점이다. https://school.programmers.co.kr/learn/courses/30/lessons/87694 문제 해결 방법 1. 배열의 크기를 두 배 늘려야합니다. 아래의 사진을 보시면 5, 3에서 6, 3으로 바로 접근을 할 수 없습니다.하지만 배열의 탐색에서는 인접인덱스끼리의 접근이 가능함으로 오답이 나오게 됩니다.따라서 기존 5, 3이 아닌 크기를 두 배를 늘린 배열을 사용해야 합니다. 따라서 해당 좌표는 (10, 6), (12, 6)으로 변경되고, 직접 접근할 수 없게 됩니다. 또한 기본적인 좌표와 배열의 좌표 표현 방식이 달라지면서 그림과..
문제 이해하기 우리가 원하는 것은 바위를 n개를 제거했을 때 최소 거리가 되는 최대 값을 찾는 것이 목적입니다.주어진 문제의 조건은 아래와 같습니다. 도착지점까지의 거리 distance는 1 이상 1,000,000,000 이하입니다. 바위는 1개 이상 50,000개 이하가 있습니다. n 은 1 이상 바위의 개수 이하입니다. https://school.programmers.co.kr/learn/courses/30/lessons/43236 문제 해결 방법 설명하기 1. 최소가 되는 최대값 찾기 우리가 원하는 것은 바위를 n개를 제거했을 때 최소 거리가 되는 최대 값을 찾는 것이 목적입니다. 따라서 바위의 숫자가 적다면 완전탐색으로도 해결이 가능하지만, 해당 문제는 바위의 개수가 50,000개이기 때문에 완전..
문제 이해하기 H-index를 찾는 문제로, h-index는 n번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용됐다면 h의 최댓값이 이 과학자의 H-index입니다 예를들면[3 0 1 6 1 5]가 있다면 3이 h-index가 됨 주의할 점은 배열에 있는 값만 h-index가 되는게 아니기 때문에 최대 값을 기준으로 h-index(0 1, 2, 3, 4, 5, 6)를 탐색해야 합니다. 문제 해결 방법 설명하기 1. 정렬 h번 이상 인용된 논문이 h개 이상이라는 것을 찾기 위해서 정렬을 수행했습니다. 이는 특정 인덱스를 기준으로 이후에 나오는 값은 모두 특정 인덱스의 값보다 크기 때문에 h번 이상이라는 것을 찾기가 쉽습니다. citations.sort() #정렬한 후 max_referen..
문제 이해하기 인천 앞바다에는 등대와 등대 사이를 오가는 뱃길이 총 n-1개 있는 등대가 n개 있습니다. 윤성이는 전력을 아끼기 위해 일부 등대만 켜둘 계획입니다. 그러나 모든 뱃길이 안전하게 운항하기 위해서는 각 뱃길의 양쪽 끝에 적어도 하나의 등대가 켜져 있어야 합니다. 문제 해결 아디어 1. leaf 노드를 불을 꺼야 함으로 먼저 leaf노드를 찾습니다. 다음과 같이 더이상 dfs로 진입할 곳이 없다면 해당 노드는 leaf노드가 됩니다. def dfs(graph, node, visited, lighthouses): for next_node in graph[node]: if not visited[next_node]: dfs(graph, next_node, visited, lighthouses) 2. ..
문제 이해하기 N개의 주사위가 주어지고, 해당 주사위에는 6개의 면에 랜덤한 숫자들이 적혀있음 이 N개의 주사위 중 N/2를 A가 가져가고, 나머지를 B가 가져가고 이렇게 가져간 주사위 중 승률이 가장 높은 주사위를 반환해야함 문제 해결 방법 1. 주사위 선택을 어떻게 하냐에 따라서 결과 값이 달라지기 완전탐색을 진행해야 합니다. 파이썬에서는 combinations 함수를 통해서 주사위 조합을 구할 수 있습니다. combi = list(combinations(range(0, len(dice)), n)) 2. 내가 선택한 주사위에서 나올 수 있는 면들의 조합, 상대 방이 선택한 주사위에서 나올 수 있는 면들의 조합을 구해야 합니다. for my_dice in combi: enemy_dice = list(s..
문제 이해하기 주어진 그래프에서 임의로 삽입된 노드를 찾고, 막대 그래프가 몇 개인지, 도넛 그래프, 8자 그래프가 몇 개인지 찾는 문제였다.여기서 중요한 점은 그래프를 순회해서 모양을 판별하는 것이 아니라, 노드와 간선의 개수를 가지고 어떤 그래프인지 판별하는 것이다. 문제 해결 방법 설명하기 1. 먼저 어떤 정점이 임의로 삽입된 정점은 진출차선만 있는 노드라고 생각했다. 2. 당연히 원래 있던 그래프에서 임의로 정접을 삽입했다고 했으니 해당 정점은 강제로 이어진 것 따라서 진출차선만 있어야 함 3. 그 다음 dfs를 사용해서 그룹을 나눴고, 해당 그룹에는 몇 개의 노드와 엣지가 있는지 계산했다. 4. 모든 노드를 순회했다면, 그룹의 노드와 엣지 정보를 토대로 어떤 그래프가 있는지 판별했다. 코드 im..
문제 이해하기 시추관을 세로로 뚫었을 때 최대 몇 개의 오일을 뽑을 수 있을까를 묻는 문제였다. 아래 그림과 같이 7번으로 뚫었을 때는 총 9개의 오일을 뽑을 수 있는 것을 볼 수 있다 문제 해결 방법 설명하기 1. DFS알고리즘을 이용해 그룹을 나누기로 결정했다. 처음에는 최대 석유 개수를 기록하려고 했는데 아래 오른쪽 그림과 같은 상황에서는 원하는 답을 찾을 수 없기 때문에 그룹으로 나누었다.예를들면 6번 라인에서 굴착을 하면 [2, 1, 1, 12]만큼 오일을 얻을 수 있다는 것을 알기가 어려울 것 같았다. 2. 굴착을 했을 때 어떤 그룹들이 있는지를 저장했다. 아래 그림과 같은 경우에는 초록색 그룹이 3개나 발견됐는데 중복을 제거하는 코드가 필요하다. 3. 그 후 시추 1, 2, ~ 8까지 반복문..
gRPC란?gRPC를 이해하기 위해서는 먼저 RPC의 개념을 이해해야 합니다. RPC는 Remote Procedure Call의 약자로, 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게 하는 프로세스 간 통신 기술을 의미합니다. 일반적으로 프로세스는 자신의 주소 공간 안에 존재하는 함수만 호출하여 실행할 수 있지만, RPC를 통해 네트워크를 통해 자신과 다른 주소 공간에서 동작하는 프로세스의 함수를 실행할 수 있습니다. 동작 방식은 다음과 같습니다:클라이언트는 stub에 정의된 함수를 호출합니다. 이 stub 코드는 데이터 타입을 XDR 형식으로 변환하여 RPC 호출을 실행합니다.서버는 수신된 함수에 대한 처리를 *Stub을 통해 처리 완료 후 결과값을 XDR로 ..
설계의 고찰기존의 알람 시스템은 각 공장마다 하나의 서버에 하나의 알람 시스템이 배포됐습니다. 이로 인해 부하가 가장 심한 시점에도 20~30건 정도의 알람만 처리되었고, SMS 대행사도 단일 대항사만을 이용했기 때문에 시스템 설계는 크게 중요하지 않았습니다. 그러나 회사에서 클라우드 서비스를 통해 여러 공장을 관제하게 됨에 따라 하루 최대 부하량이 백 건을 넘어서게 되었습니다. 또한 단일 대행사뿐만 아니라 다른 3rd-party 플랫폼(ex. 텔레그램)을 추가로 지원해야 했습니다. 이에 따라 알람 시스템 설계가 중요해졌습니다. 고객사는 처리 속도에 대한 요구를 내어놓았습니다. 긴급한 알람(실시간 환자 감지, 누수 감지, 화재 감지 등)은 소프트 실시간으로 처리되어야 하며, cron 작업으로 돌아가는 알..