일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 이분탐색
- BFS
- 누적합
- 깊게 생각해보기
- branch 전략
- 객체지향패러다임
- jwt 표준
- 트랜잭샨
- 숫자 블록
- 결제서비스
- gRPC
- 구현
- 디버깅
- 레디스 동시성
- 좋은 코드 나쁜 코드
- prg 패턴
- 검색어 추천
- 쿠키
- piplining
- 백준
- docker
- AWS
- spring event
- 알람 시스템
- 카카오
- 프로그래머스
- 코드 계약
- 셀러리
- 완전탐색
- 수신자 대상 다르게
- Today
- Total
목록개발 (111)
코딩관계론
문제 이해하기문제가 총 두가지가 있다. 하나는 json파일을 읽어 고객의 tag와 username을 오름차순으로 반환하는 것과 쿼리파라마으로 tag와 username이 주어지면 승률을 반환하는 형식이다. json파일로 고객의 정보가 아래의 형태로 나타난다. { "id": 1, "username": "wt7Py", "tag": "bOCv", "win": 617, "lose": 875 } 문제 해결 방법 설명하기1. 고객의 username과 tag로 정렬하는 방법내가 사용한 방법은 읽어온 json파일에서 tag와 username만 따로 저장한 후 해당 값들을 key로 잡아서 정렬하는 것이었다.@app.route("/api/gamerec..
문제 이해하기 선영이라는 친구가 새로운 함수를 만들었는데, 해당 함수는 "R"과 D로만 이루어져있다.R은 reverse고 d는 delete다. 즉 R을 만나면 배열을 뒤집어야 하고, D를 만나면 해당 배열에서 젤 처음 숫자를 삭제해야한다.문제 해결 방법 설명하기1. R을 만나면 배열을 역순으로 변경해야할까?그렇다 R을 만날 때 마다 매번 배열을 역순으로 변경한다면 시간초과가 나타난다. 따라서 우리는 배열이 뒤집어 졌다는 것을 기억하고, 실제로 연산은 수행하지 말아야 한다. for f in funcStr: if f == "R": direction = not direction 2. D를 만나면 배열에서 삭제를 진행해야 할까?D의 연산의 경우 실제로 수행해도 상관은 없다 ..
문제 이해하기조교들이 새로운 보안 시스템을 설치하기로 했습니다. 이 시스템은 알파벳 소문자로 이루어진 암호를 사용하며, 최소 한 개의 모음과 최소 두 개의 자음이 포함되어야 합니다. 또한 알파벳은 증가하는 순서로 배열되어야 합니다. 주어진 C개의 문자로 가능성 있는 암호를 구하는 프로그램을 작성해야 합니다. 문제 해결 방법 설명하기1. 모든 알파벳을 조합해야 합니다.아래의 코드를 사용하면 모든 조합을 구할 수 있습니다.def possible_passwords(length, num_chars, characters): results = [] combinations_list = list(combinations(characters, length)) 2. 조건검사만들어진 문자열 조합에서 모음과 자음의..
문제 이해하기주어진 쿼리가 있고, 그 중에 몇 개의 월드가 매칭되는지 찾는 문제였다.참고로 필자는 틀렸고, 어떤 접근 방법을 통해서 틀렸는지 설명하고 풀이법을 설명하겠다.틀린 문제 해결 접근 과정1. 경우의 수 검색하기문제의 경우의 수를 보면 주어진 word의 길이는 100,000이고 word[x]의 길이는 최대 10,000이 된다.따라서 word를 하나씩 분리하면 해결이 가능하지 않을까 싶었다. 왜냐하면 분리에 N*M의 경우의 수만 사용하면 됐기 때문이다예시f????fr???fro??frod?????o???do.....????? 그 후 분리된 값들을 아래와 같은 방식으로 캐시에 저장하고 쿼리 배열 탐색을 cache에 찾아서 꺼내는 방식이었다.cache['fr???] += 1하지만 효율성4, 5에서 시간..
문제 이해하기n이 주어지면 그 중에 올바른 괄호쌍이 몇 개 있을 수 있는지 찾는 문제였다.올바른 괄호쌍이란 ()()()와 같이 모두 닫친 괄호를 의미한다.문제 해결 방법 설명하기1.가지치기n이 28(14 * 2)이기 때문에 완전탐색은 제한시간 내에 풀 수 없다. 따라서 시간을 줄이기 위해서 DP를 선택하던가 탐색하지 않아도 실패하는 경우를 발견해서 탐색을 줄여야 한다. 필자는 가지치기를 선택했고, 그 조건에 탐색 시점에서 남은 '(' 의 개수가 남은 ')'의 개수보다 많다면 탐색을 멈추도록 했다. 왜냐하면 닫친 괄호가 더 적게 남았다면 '(())))" 다음과 같은 상황이기 때문이다. if left_bracket > right_bracket: return 0 2. 완전탐색또한 항상 남..
문제 이해하기이동하는 방향이 담긴 배열이 주어질 때, 방의 갯수를 return하는 문제였습니다. 문제 해결 방법 설명하기1. 닫친 방이란?닫친 방을 생각해본다면 이미 방문한 정점에 다시 한번 방문 했을 때 닫친 방이라고 생각할 수 있다.하지만 주의할 점은 다시 방문한 정점은 이전에 사용되지 않은 edge로 부터 진입해야 한다는 점이다. 2. 배열의 확장 배열의 확장은 왜 필요한가.4각형 배열이기 때문에 중간 정점은 생각하지 못하게 된다.따라서 배열의 확장을 통해 중간 정점을 표현할 수 있게 만들어줘야 닫친 방을 모두 찾을 수 있게 된다. 코드from collections import dequedef solution(arrows): answer = 0 visited = {} dir = {}..
문제 이해하기삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 하시오. https://school.programmers.co.kr/learn/courses/30/lessons/43105 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr문제 해결 방법 설명하기1. 최대값을 찾는 방법최대값이 되는 경로를 찾기 위해서는 모든 가능한 경로를 탐색해야 합니다. 그러나 모든 경로를 매번 계산하려고 하면 제한된 시간 내에 문제를 해결할 수 없습니다. 따라서 이전에 저장한 정보를 활용하는 방법이 필요합니다. 제가 선..
문제 이해하기부분 펄스가 있는데 해당 부분 펄스를 적용하고 나서 가장 큰 합을 가지는 부분 수열의 값을 찾는 문제였다. https://school.programmers.co.kr/learn/courses/30/lessons/161988 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 해결 방법 설명하기 1. 가장 큰 부분 수열이 되려면?가장 큰 부분 수열을 찾기 위해서 크게 두 가지 방법이 있다. 하나는 이중 for문을 이용해서 가장 큰 값을 갖는 부분 수열을 찾을 수 있을 것이다. 하지만 sequence 배열의 길이를 보면 해당 방법은 불가능하다. 따라..
문제 이해하기케이크를 잘라서 토핑을 공평하게 나눌 수 있는 가짓수 방법을 찾는 문제였다. 문제 해결 방법 설명하기1. 케이크를 나누기 전 토핑의 가짓수를 계산합니다 for i in topping: if not i in topping_right.keys(): topping_right[i] = 1 else: topping_right[i] += 1 2.토핑을 하나씩 제거하면서 공평하게 나눠지는지를 계산합니다. for i in topping: if len(topping_left.keys()) == len(topping_right.keys()): answer += 1 if ..
문제 이해하기 숫자로 이루어진 문자열 numbers가 주어졌을 때 최소한의 시간으로 타이핑을 하는 경우의 가중치 합을 return 하도록 solution 함수를 완성해주세요문제 해결 방법 설명하기1. 경우의 수 계산하기일단 숫자의 Length가 100,000이기 때문에 완전탐색으 진행한다면 2^100,000이 되니깐 제한시간안에 풀기는 불가능하다.따라서 다른 접근 법이 필요했다. 2. 그리디인가?다른 접근 법 중 처음 생각난 것은 그리디였다. 왜냐하면 왼손과 오른손 중에 다음 칸에 도달할 수 있는 가장 빠른 경로를 구하면 최적의 답이라고 생각했지만 다음과 같은 경우에는 최적의 답을 찾을 수 없게 된다."왼쪽 손이 4번 칸에 위치하고, 오른쪽손이 6번 칸에 위치했을 때 5번 칸으로 이동하려면 어떤 손을 선..
문제 이해하기어떤 왕국에사 새로운 도시를 건설하기 위해선 금과 은이 필요하다.왕은 새로운 도시를 건설하기 위해서 기존 도시에서 금과 은을 가지고 오려고 하고, 이 광물이 새로운 도시에 도착하기 까지 일정 시간이 소요된다.새로운 왕국에 필요한 금과 은이 배달되기 까지의 시간을 구하라. https://school.programmers.co.kr/learn/courses/30/lessons/86053 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 해결 방법 설명하기 1. 경우의 수 계산하기 왕국 내에 존재할 수 있는 도시의 최대..
문제 이해하기 부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 계산하는 문제였다. 단 모든 예산을 지원해야 한다.문제 해결 방법 설명하기1. 경우의 수 계산하기 문제를 풀기 위해서 먼저 경우의 수를 계산해야 하는데 부서별 지원여부를 두고 경우의 수를 계산하면 2(해당 부서의 지원 여부 O or x)^100(부서의 개수)가 나오게 되고, 제한시간안에 문제를 해결할 수 없다. 따라서 완전 탐색은 사용할 수 없게 된다. 최대한 많은 부서에 예산을 지원하면 되기 때문에 예산 요청이 작은 순으로 지원하면 된다. 따라서 그리디하게 지원하면 문제를 해결할 수 있다. 코드def solution(d, budget): ..