[gRPC] gRPC 개요, MSA 서비스간 통신, gRPC vs REST
·
MSA
마이크로 서비스간 통신 이슈 MSA에서는 여러 모듈로 분리되어있고 동일 머신에 존재하지 않을 수 있습니다. 따라서 일반적으로는 보편화된 방식인 REST 통신을 통해 메시지를 주고 받습니다. TTP 1.0은 요청/응답을 하기에 앞서 매번 Connection을 맺고 끊어야했기 때문에 연결 요청/해제 비용이 상당히 높았습니다. RPC Remote Procedure Calls 다른 컴퓨터의 프로그램의 프로시저를 실행하는 프로그램을 허용하는 프로토콜 개발자가 원격 상호 작용에 대한 세부 정보를 명시적으로 코딩하지 않아도 됨 프레임워크가 자동 핸들링 클라이언트 코드에서는 직접 서버 코드의 함수를 호출하는 것처럼 보임 gRPC google Remote Procedure Call 구글에서 만든 원격 프로시저 호출 프레..
[Keycloak] MSA에서 키클록 Spring Security 연동 (2) 토큰 발급, 토큰값 확인
·
Spring
[Keycloak] MSA에서 키클록 Spring Security 연동 (1) dependency 추가, gateway/auth 서비스 설정 개발환경 macOS Spring Boot 2.7.5 RELEASE JAVA 11 1. MSA 서비스 구조 서비스 디스커버리 패턴으로 gateway 서비스(api gateway)를 통해 각 서비스의 api를 호출하는 형태입니다. auth 서비스를 통해 회원가입/로그 karla.tistory.com 1. auth 서비스 - 회원가입 AuthController authService를 통해 keycloack DB에 사용자 생성 후, userService를 통해 부가적인 사용자 데이터를 user DB에 저장 // 회원가입 @PostMapping("/signup") publi..
파이썬 내장함수 bit_length, 이진수 길이, bit_count, 이진수 1의 개수
·
Python
bit_length 이진수로 정수를 나타내는 데 필요한 비트 수 반환 (버전 3.1에 추가) n = -37 bin(n) # -0b100101 n.bit_length() # 6 x 가 0이 아니면, x.bit_length() 는 2**(k-1)
마이크로서비스 분산 트랜잭션 관리, 보상 트랜잭션, MSA Transaction | Two Phase Commit, Saga Pattern
·
MSA
2PC (Two Phase Commit) 분산 시스템에서 트랜잭션을 변경할 수 있는 기능을 제공하는 방식 Transaction Coordinator가 각 서비스의 Commit. Rollback 을 제어하는 형태로 트랜잭션을 관리함 2PC는 서비스가 증가할수록 시스템의 대기 시간이 길어지며, 이는 응답시간의 증가를 초래함 Lock을 잡아야 하는 Row의 범위가 크거나 트랜잭션 기간이 긴 경우 시스템에 엄청난 대기시간을 발생하므로 수명이 매우 짧은 작업에만 사용하는 것을 권장 마이크로서비스 전체에서 상태 변경을 조정하기 위해 2PC와 같은 분산 트랜잭션을 사용하지 않는 것이 좋음 2PC는 결국 Coordinator를 기반으로 강력한 결합을 유도하고, 데이터에 직접적인 Lock을 잡고 처리하기 때문에 서비스간..
[Keycloak] OAuth2 MSA에서 키클록 SSO Spring Security 연동 (1) dependency 추가, gateway/auth 서비스 설정
·
Spring
개발환경macOSSpring Boot 2.7.5 RELEASEJAVA 11 1. MSA 서비스 구조서비스 디스커버리 패턴으로 gateway 서비스(api gateway)를 통해 각 서비스의 api를 호출하는 형태입니다.auth 서비스를 통해 회원가입/로그인 등 계정 및 권한을 관리합니다. (키클록 토큰 발급)  2. gateway 서비스 설정0) 프로젝트 구조📦gatewayserver ┣ 📂src ┃┣ 📂main ┃ ┃ ┣ 📂java ┃ ┃ ┃ ┗ 📂com ┃ ┃ ┃ ┃ ┗ 📂cloud ┃ ┃ ┃ ┃ ┃ ┗ 📂gatewayserver ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜GatewayserverApplication.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜SecurityConfig.java ┃ ┃ ┗ ?..
시간복잡도, 시간제한, 빅오(Big-O) 표기법
·
Coding Test
1초 제한 n으로 구성된 O( )를 계산했을 때의 값이 1억 정도면 1초 정도의 시간이 걸린다고 한다. 예를 들어 N의 최대값이 10만이라고 문제에서 주어진다면 1. O(N) 의 시간복잡도일 경우에 값이 10만 정도이니, 1/1000초 정도가 걸릴 것이라고 예상할 수 있다. 2. O(N^2)의 시간복잡도의 경우에 값은 100억이므로, 100초 정도가 걸릴 것이라고 예상할 수 있다. 보통 1초가 걸릴 때 입력의 최대 크기를 살펴보면 O(N): 약 1억 O(N^2) : 약 1만 O(N^3) : 약 500 O(2^N) : 약 20 O(N!): 10 N의 크기에 따른 허용 시간 복잡도 N의 크기 시간복잡도 N ≤ 11 O(N!) N ≤ 25 O(2N) N ≤ 100 O(N4) N ≤ 500 O(N3) N ≤ 3..
ProcessBuilder Java 쉘 명령어, 스크립트 실행
·
Java
쉘 스크립트 실행 1. ProcessBuilder 객체 생성 ProcessBuilder builder = new ProcessBuilder(); ProcessBuilder객체를 사용하여 Linux 또는 Window의 커맨드라인의 커맨드입력을 실행할 수 있다. 2. directory(new File(“파일경로”)) : 해당 커맨드를 실행할 경로 String homeDirectory = System.getProperty("user.home"); builder.directory(new File(homeDirectory)); 3. command(“커맨드”) : 커맨드 입력메서드 builder.command("sh", "-c", "ls -l | grep P"); 4. ProcuessBuilder.start() :..
객체 지향 프로그래밍 OOP 특징 | 캡슐화, 추상화, 상속, 다형성
·
Java
OOP(Object Oriented Programming) 문제를 여러 개의 객체 단위로 나눠 작업하는 방식으로 객체들이 서로 상호작용하는 프로그래밍 이론 객체들의 모임으로 파악하는 것 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미 클래스를 이용하여 관련있는 처리(기능) 부분과 데이터 부분을 하나의 객체(인스턴스)로 묶어 생성하여 사용 캡슐화 (Encapsulation) 데이터와 코드의 형태를 함께 묶어 외부에서 알 수 없도록 하고, 데이터의 구조와 역할/기능을 하나의 캡슐형태로 구현하는 방법 캡슐화의 중요한 목적은 변수를 private 으로 선언하여 데이터를 보호하는 것 보호된 변수는 getter()/setter() 메소드를 통해..
K번째수 (정렬)
·
programmers
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr def solution(array, commands): answer = [] for i,j,k in commands: answer.append(sorted(array[i-1:j])[k-1]) return answer def solution(array, commands): return list(map(lambda x:sorted(array[x[0]-1:x[1]])[x[2]-1], commands))
뒤에 있는 큰 수 찾기 (스택)
·
programmers
def solution(numbers): answer = [-1]*len(numbers) stack = [] for i in range(len(numbers)): while stack and numbers[stack[-1]]
프로세스 (큐)
·
programmers
def solution(priorities, location): q = [(p,i) for i,p in enumerate(priorities)] cnt=0 while True: p= q.pop(0) if any(p[0] < x[0] for x in q): q.append(p) else: cnt+=1 if p[1] == location: return cnt from collections import deque def solution(priorities, location): q=deque() for i in range(len(priorities)): x=priorities[i] q.append((x,i)) cnt=0 while q: p= q.popleft() flag=False for i in q: if p..
멀리 뛰기 (DP)
·
programmers
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 분석 [11726번] 2×n 타일링 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. www.acmicpc.net 분석 karla.tistory.com 풀이 def solution(n): d=[0]*(n+2) d[1]=1 d[2]=2 for i in range(3, n+1): d[i]= (d[i-1]+d[i-2])%1234567 return d[n]
귤고르기 (정렬, Counter)
·
programmers
from collections import Counter def solution(k, tangerine): answer=0 d=Counter(tangerine) d = sorted(d.items(), key=lambda x: x[1], reverse=True) if len(d)==1: return 1 else: sum=0 for i in range(len(d)): if k>sum: sum += d[i][1] answer+=1 else: break return answer
다트 게임 (구현)
·
programmers
def solution(dartResult): n='' temp=[] for i in range(len(dartResult)): x = dartResult[i] if x.isdecimal(): n+=x elif x.isalpha(): j=1 if x=='D': j=2 elif x=='T': j=3 temp.append(int(n)**j) n='' else: if x=='*': if len(temp)>1: temp[-2]=temp[-2]*2 temp[-1]=temp[-1]*2 elif x=='#': temp[-1]=temp[-1]*(-1) return sum(temp)
합승 택시 요금 (다익스트라)
·
programmers
[1753번] 최단경로 구하기 (다익스트라, 우선순위큐, 힙) 다익스트라 음수간선 X S 시작점부터 다른 모든 노드로 가는 최단거리 구하는 알고리즘 기출 : 음수간선이 없는데 시작점이 있고 최단거리 구하는 문제 원리 최단거리를 구할 노드에서 시작하여 karla.tistory.com from heapq import heappush, heappop def solution(n, s, a, b, fares): INF = int(1e9) answer = INF graph = [[] for _ in range(n + 1)] for f in fares: i, j, k = f graph[i].append((j, k)) graph[j].append((i, k)) def dijk(start): # s를 시작점으로하는 다익..
표병합 (구현, 유니온파인드)
·
programmers
""" UPDATE r c value : (r,c) value 저장 UPDATE value1 value2 : value1값 value2로 변경 MERGE r1 c1 r2 c2 : (r1, c1) 위치의 셀과 (r2, c2) 위치의 셀을 선택하여 병합 UNMERGE r c: 병합을 해제 PRINT r c : (r, c) 위치의 셀 출력 """ def solution(commands): n=50 board=[[(i,j) for j in range(n)] for i in range(n)] # 좌표 넣고 병합셀이면 좌측좌표 저장 str_board=[['EMPTY']*n for _ in range(n)] # 값 저장 answer = [] for c in commands: arr=c.split() if arr[0]..
자바 순열, 조합 구하기 (파이썬 itertools 라이브러리)
·
Java
자바는 파이썬의 itertools 라이브러리 같은 내장함수로 순열, 조합이 없어 직접 구현해야함 n개중에 r개 선택한다는 가정 Depth를 r만큼 재귀 변수 int n, r : n개 중 r개를 뽑음 int[] now : 현재 저장한 list값 인덱스 List result : 결과값 boolean[] visited : 순열 방문 여부 순열 public static void permutation(List list, int depth) { if (depth == r) { List temp = new ArrayList(); for (int i = 0; i < now.length; i++) { temp.add(list.get(now[i])); } result.add(temp); return; } for (int ..
[CICD] Jenkins + ArgoCD + k8s | CI, 젠킨스 파이프라인, Jenkinsfile, MSA
·
Devops
GitHub - Guts-Gun/KITe_backendContribute to Guts-Gun/KITe_backend development by creating an account on GitHub.github.com 구축 순서1. Jenkins Pipeline & Github webhook 설정2. Jenkinsfile 작성3. ArgoCD 구축 Jenkins PipelineJob들을 순차적 혹은 병렬적으로 실행시키거나 작성한 스크립트로 이벤트들을 연속적으로 실행시키는 등의 일을 지원하는 기능Job 하나 작성할 때 대부분 GUI로 제공받아 마우스로 체크해서 설정했다면 Pipeline은 이러한 내용들을 스크립트를 통해 더 딥하고 유연하게 작성할 수 있음작성하려는 배포 플로우가 복잡하다면 pipeline ..
Spring Jsch SSH Private Key, Dockerfile 복사, Jsch kubernetes pod
·
Spring
Spring Jsch java ssh 접속private Session session; private ChannelExec channelExec; connect public void connectSSH() throws JSchException { JSch jsch = new JSch(); session = jsch.getSession(username, host, port); session.setPassword(password); session.setConfig("StrictHostKeyCheckikarla.tistory.com SSH Authentication 동작 방식Client → Server : SSH connection을 요청Server → Client : Random message 전송Client..
[프로그래머스] 아방가르드 타일링 (DP)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/181186 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 분석 2를 표현하는 방법 3을 표현하는 방법 DP(10) = DP(9) + 2*DP(8) + 5*DP(7) + 2*DP(6) + 2*DP(5) + 4*DP(4) + 2*DP(3) + 2*DP(2) + 4*DP(1) + 2 DP(n)을 구하는데 DP(n-4)부터는 반복되는 구간이 나타나므로 DP(n+3)에서 DP(n)을 빼서 하위 구간을 삭제 DP(13) - DP(10) = DP(12) + 2*D..
[프로그래머스] 로또의 최고 순위와 최저 순위
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 분석 최대한 맞추는 경우 : 0의 개수 + 일치 개수 최소한 맞추는 경우 : 일치 개수 당첨 번호 31 10 45 1 6 19 결과 최고 순위 번호 31 0→10 44 1 0→6 25 4개 번호 일치, 3등 최저 순위 번호 31 0→11 44 1 0→7 25 2개 번호 일치, 5등 풀이 def solution(lottos, win_nums): c = 0 for i in lottos: if i in..
[프로그래머스] 모두 0으로 만들기 (그래프 DFS)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/76503 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 분석 dfs 탐색하면서 부모 노드에 값 옮기면서 값 카운트 풀이 import sys sys.setrecursionlimit(10**9) answer=0 def solution(a, edges): if sum(a)!=0: return -1 graph=[[] for _ in range(len(a))] for s,e in edges: graph[s].append(e) graph[e].append(s) ..
[프로그래머스] 방문 길이 (set)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/49994 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 분석 게임 캐릭터가 처음 걸어본 길의 길이 (시작 좌표, 도착좌표) , (도착 좌표, 시작 좌표) 저장 시작-도착, 도착-시작 같은 길이므로 둘 다 저장 중복 없이 저장하기 위해 set 사용 set길이/2 리턴 (시작-도착, 도착-시작은 같은 길이므로) 풀이 def solution(dirs): d={'U':(-1,0),'D':(1,0),'R':(0,1),'L':(0,-1)} sets = set()..
[프로그래머스] 연속 펄스 부분 수열의 합 (누적합, 구간합, DP)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/161988 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 분석 [2, 3, -6, 1, 3, -1, 2, 4] sequence 2 3 -6 1 3 -1 2 4 -1 1 펄스 -2 3 6 1 -3 -1 -2 4 -1 1 펄스 누적합 -2 1 7 8 5 4 2 6 1 -1 펄스 2 -3 -6 -1 3 1 2 -4 1 -1 펄스 누적합 2 -1 -7 -8 -5 -4 -2 -6 구간합 최댓값 구하기 = max(누적합리스트) - min(누적합리스트) 더보기 2..
디펜스 게임 (우선순위큐, 힙)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/142085# 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 분석 통과 못하는 시점의 인덱스 = 몇 라운드까지 막을 수 있는지 병사의 수 n=7 사용 가능한 무적권의 횟수 k = 3 라운드마다 공격해오는 적의 수 enemy = [4, 2, 4, 5, 3, 3, 1] 인덱스 힙 병사수 0 [4] 7 1 [2, 4] 7 2 [2, 4, 4] 7 3 [2, 4, 4, 5] (한 라운드 무적권 사용불가하므로 병사 수 계산) 5 4 [2, 3, 4, 5, 4] ..
리코쳇 로봇 (BFS)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/169199 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 분석 한 번의 이동 : 상, 하, 좌, 우 4방향 중 하나를 선택해 게임판 위의 장애물이나 맨 끝에 부딪힐 때까지 미끄러져 이동하는 것 1. 다음 좌표 값을 board 격자 안 장애물이 아닐 때까지 이동 후 지정 2. 방문하지 않았다면 현재 이동수 +1 저장 . . . D . . R . D . G . . . . . . . D . D D . . . . D . . D . . . . . 아래, 왼쪽,..
가장 긴 팰린드롬 (2중 for문 인덱스, 투포인터, 문자열 길이)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/12904 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 1. 2중 for문 완전 탐색 Time: 3926.56 ms def solution(s): answer = 0 for i in range(len(s)): for j in range(i+1,len(s)+1): if s[i:j]==s[i:j][::-1]: answer=max(answer, len(s[i:j])) return answer "abacde" a ab aba abac abacd abac..
단어 변환 (BFS, deque, 리스트 거쳐 target 단어로 변환하기)
·
programmers
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr from collections import deque def solution(begin, target, words): answer = 0 v=[0]*len(words) # 단어 사용체크 리스트 q = deque() q.append([begin, 0]) while q: word, cnt = q.popleft() if word == target: answer = cnt break for i in range(len(words)): word2=words[i] temp_cnt = 0 if not v[i]: # 사용안한..
카펫
·
programmers
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr def solution(brown, yellow): s = brown+yellow for i in range(1,s//2): if s%i==0: if i2: if (s//i-2)*(i-2)==yellow: return [s//i,i] def solution(brown, yellow): s = brown+yellow for i in range(1, int(yellow**(1/2))+1): if yellow % i == 0: if 2*(i + yellow//i) == brown-4: return [yellow//..
줄 서는 방법 (팩토리얼, 순열)
·
programmers
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 분석 사람의 수 n과, 자연수 k가 주어질 때, 사람을 나열 하는 방법을 사전 순으로 나열 했을 때, k번째 방법을 반환 [1722번] 순열의 순서 구하기(수학, 구현) 1722번: 순열의 순서 첫째 줄에 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄의 첫 번째 수는 소문제 번호이다. 1인 경우 k(1 ≤ k ≤ N!)를 입력받고, 2인 경우 임의의 순열을 나타내는 N개의 수를 입력받는다. N karla.tistory.com 풀이 def solution(n, k): answer = [] fList = [0] ..
예상 대진표 (XOR 연산, bit_length)
·
programmers
[1057] 토너먼트 1057번: 토너먼트 김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 karla.tistory.com import math def solution(n,a,b): # a, b 를 xor 취하는 과정에서 ab 사이의 거리가 가까우면 상위비트는 차이가 나지않음 # 거꾸로 ab 사이의 거리가 멀면 상위비트가 차이남 return ((a-1)^(b-1)).bit_length()
유사 칸토어 비트열
·
programmers
n 번째 일 때 1의 개수는 4**n 개이니까 주어진 구간을 5의 배수로 나누었을 때 나눠지면 그때의 제곱수가 n 번째 단계의 1의 개수 값과 동일하다. 이런 식으로 나머지가 없어질 때까지 반복하면 주어진 값까지의 1의 개수를 구할 수 있고 a~b 구간의 값을 구하려면 b까지의 1의 개수에서 a까지의 1의 개수를 빼면 된다. def solution(n, l, r): answer = 0 l-=1 a=b=0 def f(x): for i in range(20,-1,-1): if 5**i2: t-=1 return (4**i)*t, x%(5**i) while l or r: a1,l = f(l) b1,r = f(r) a += a1 b += b1 return b-a def solution(n, l, r): answe..
당구연습 (그래프, 구현)
·
programmers
import sys,math # 점과 점 사이의 거리 구하는 함수 def dist(x1, y1, x2, y2): result = math.sqrt(math.pow(x1-x2,2) + math.pow(y1-y2,2)) return result def solution(m, n, startX, startY, balls): answer=[] for endX, endY in balls: minval=sys.maxsize # 일직선으로 공이 먼저 부딪히는 경우 빼고 계산 if not (startX==endX and startYendY): # 하 minval = min(minval, dist(startX, -startY, endX, endY)) if not (startY==endY and startX>endX): #..
햄버거 만들기 (스택)
·
programmers
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr def solution(ingredient): s = [] cnt = 0 for i in ingredient: s.append(i) if s[-4:] == [1, 2, 3, 1]: cnt += 1 for _ in range(4): s.pop() return cnt
택배 상자(스택, 큐)
·
programmers
영재가 5개의 상자를 실어야 하며, 택배 기사님이 알려준 순서가 [4, 3, 1, 2, 5] 영재는 우선 첫 번째, 두 번째, 세 번째 상자를 보조 컨테이너 벨트에 보관합니다. 그 후 네 번째 상자를 트럭에 싣고 보조 컨테이너 벨트에서 세 번째 상자 빼서 트럭에싣습니다. 다음으로 첫 번째 상자를 실어야 하지만 보조 컨테이너 벨트에서는 두 번째 상자를, 기존의 컨테이너 벨트에는 다섯 번째 상자를 꺼낼 수 있기 때문에 더이상의 상자는 실을 수 없습니다. 따라서 트럭에는 2개의 상자만 실리게 됩니다. def solution(order): assist = [] i = 1 cnt = 0 while i != len(order)+1: assist.append(i) while assist and assist[-1] =..
완주하지 못한 선수 (해시, 딕셔너리)
·
programmers
from collections import Counter def solution(participant, completion): dic1=Counter(participant) dic2=Counter(completion) answer=dic1-dic2 return list(answer.keys())[0] from collections import Counter def solution(participant, completion): dic1=Counter(participant) dic2=Counter(completion) for x in dic1: if dic1[x]-dic2[x]!=0: return x
디스크 컨트롤러 (힙, 우선순위 큐)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/42627 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 분석 리스트 끝나는 시간 정렬해서 풀 경우 (1,3)(0,2) ➔ 시작 불가하므로 불가능 풀이 from heapq import heappush, heappop def solution(jobs): answer=0 h=[] pre=-1 # 직전 종료 시각 i=0 # 현재 시각 cnt=0 # 처리개수 while cnt
로그인 성공?
·
programmers
def solution(id_pw, db): for x in db: if x[0]==id_pw[0]: if x[1]==id_pw[1]: return "login" else: return "wrong pw" return "fail"
모음사전 (완전 탐색, product)
·
programmers
from itertools import product def solution(word): arr=['A', 'E', 'I', 'O', 'U'] arr.sort() prod=[] for i in range(1,6): prod+=list(product(arr, repeat=i)) prod.sort() cnt=1 for x in prod: str="".join(x) print(str) if str==word: break else: cnt+=1 return cnt
피로도 (던전탐험, 완전 탐색, permutations)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/87946 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr """ 최소 필요 피로도"는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, 소모 피로도"는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. """ from itertools import permutations def solution(k, dungeons): max_cnt=0 for x in permutations(dungeons, len(dungeons)): hp=k ..
사라지는 발판 (DFS)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/92345 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 dr=[0,0,-1,1] dc=[1,-1,0,0] def solution(board, aloc, bloc): n=len(board) m=len(board[0]) visited = [[0]*5 for _ in range(5)] # 방문 block=[[0]*5 for _ in range(5)] # 발판 def dfs(p1,p2): r, c = p1[0], p1[1] # 현재 플레이어 좌표 opr..
뉴스 클러스터링 (문자열 리스트 합집합, 교집합, 중복 허용 다중집합)
·
programmers
from collections import Counter def solution(str1, str2): answer = 0 str1,str2=str1.upper(), str2.upper() a=[] for i in range(1,len(str1)): if str1[i-1].isalpha() and str1[i].isalpha(): a.append(str1[i-1]+str1[i]) b=[] for i in range(1,len(str2)): if str2[i-1].isalpha() and str2[i].isalpha(): b.append(str2[i-1]+str2[i]) if len(a)==len(b)==0: return 65536 a = Counter(a) b = Counter(b) c = list((a..
압축 (ascii_uppercase, 알파벳 딕셔너리)
·
programmers
from string import ascii_uppercase def solution(msg): answer = [] c = [i for i in range(1,27)] a= dict(zip(ascii_uppercase,c)) w='' for x in msg: w+=x if w not in a: a[w]=len(a)+1 answer.append(a[w[:-1]]) w = w[-1] answer.append(a[w]) return answer
실패율 (list.count() 함수)
·
programmers
def solution(N, stages): result = {} a = len(stages) for i in range(1,N+1): if a != 0: cnt = stages.count(i) # stages에서 i의 개수 result[i] = cnt/a a-=cnt else: result[i] = 0 return sorted(result, key=lambda x: result[x], reverse=True) def solution(N, stages): answer = [] a = [0] * (N+1) for x in stages: a[x - 1] += 1 b = {} for i in range(N): if sum(a[i:]) != 0: b[i+1]=a[i]/sum(a[i:]) else: b[i+1]=..
괄호변환 (문자열, 구현)
·
programmers
""" p는 '(' 와 ')' 로만 이루어진 문자열이며 길이는 2 이상 1,000 이하인 짝수입니다. 문자열 p를 이루는 '(' 와 ')' 의 개수는 항상 같습니다. """ def solution(p): if p=='': # 1 return p r=True c=0 for i in range(len(p)): # 2 if p[i]=='(': c-=1 else: c+=1 if c>0: # 순서 올바르지않음 r=False if c==0: if r: # 3 return p[:i+1]+solution(p[i+1:]) else: # 4 return '('+solution(p[i+1:])+')'+''.join(list(map(lambda x:'(' if x==')' else ')',p[1:i]) )) def r(w):..
캐시 (구현)
·
programmers
def solution(cacheSize, cities): answer=0 q=[] if cacheSize==0: return len(cities)*5 for x in cities: x = x.upper() if x in q: answer+=1 q.remove(x) q.append(x) else: answer+=5 if len(q)>cacheSize-1: q=q[1:] q.append(x) return answer
문자열 압축 (구현)
·
programmers
def solution(s): answer=len(s) for i in range(1, len(s)//2+1): res="" prev=s[0:i] # 앞에서부터 i 문자열 추출 cnt=1 for j in range(i, len(s), i): # i만큼 증가시키며 이전 문자열과 비교 if prev==s[j:j+i]: cnt+=1 # 이전 상태와 동일하면 증가 else: # 다른 문자열이 나왔다면, 압축 불가 res += str(cnt)+prev if cnt>=2 else prev # 초기화 prev=s[j:j+i] cnt=1 # 남아있는 문자열 res+=str(cnt)+prev if cnt>=2 else prev answer=min(answer, len(res)) return answer
합승 택시 요금 (플로이드 워셜)
·
programmers
플로이드 워셜 알고리즘 분석 [11403] 경로 찾기 (플로이드-워셜) 11403번: 경로 찾기 가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시 karla.tistory.com def solution(n, s, a, b, fares): INF = 10000000 answer = INF graph = [[INF for j in range(n)] for i in range(n)] for f in fares: i, j, k = f graph[i-1][j-1]=k graph[j-1][i-1]=k print(graph) for k in range(n): for i in range(n): for j in range(n)..
양궁대회 (재귀)
·
programmers
from copy import deepcopy max_diff, max_board = 0, [] def solution(n, info): def dfs(ascore, lscore, cnt, idx, board): global max_diff, max_board if cnt > n: return if idx > 10: diff = lscore - ascore if diff > max_diff: board[10] = n - cnt max_board = board max_diff = diff return if cnt < n: board2 = deepcopy(board) board2[10 - idx] = info[10 - idx] + 1 dfs(ascore, lscore + idx, cnt + info[10 -..
양궁대회 (조합, 완전 탐색)
·
programmers
순열조합 이터레이터 인자 결과 product() p, q, … [repeat=1] 데카르트 곱(cartesian product), 중첩된 for 루프와 동등합니다 permutations() p[, r] r-길이 튜플들, 모든 가능한 순서, 반복되는 요소 없음 combinations() p, r r-길이 튜플들, 정렬된 순서, 반복되는 요소 없음 combinations_with_replacement() p, r r-길이 튜플들, 정렬된 순서, 반복되는 요소 있음 예 결과 product('ABCD', repeat=2) AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD permutations('ABCD', 2) AB AC AD BA BC BD CA CB CD DA DB DC..