[Mac OS / Java] 맥 JDK 자바 버전 변경
·
Java
현재 jdk 버전 확인 java -version 설치된 모든 jdk 버전들 확인 /usr/libexec/java_home -V 사용하는 shell 확인 echo $SHELL bash 혹은 zsh vi 를 통해 환경변수 수정 vi ~/.bash_profile #bash vi ~/.zshrc # zsh 사용하는 shell에 따라 파일 열기 export JAVA_HOME=$(/usr/libexec/java_home -v 1.8.0) export JAVA_HOME=$(/usr/libexec/java_home -v 11) export JAVA_HOME=$(/usr/libexec/java_home -v 17) 변경하려는 버전 입력 i 키를 입력해 수정 :wq! 를 입력해 저장 후 편집기 닫기 source ~/.zs..
Spring Batch, 배치와 스케줄러의 차이, Job, Tasklet, Chunk
·
Spring
배치 배치는 실시간으로 처리하는것이 아닌 처리할 작업물들을 모아 한번에 처리하는 것 예를들어 1년간 접속하지않은 모든 회원들을 휴먼계정으로 처리하는 등 일반적인 비즈니스로직이 아닌 상황에 대해서 처리해주는 프로세스 배치와 스케줄러의 차이 배치 스캐쥴러 일괄 처리 정해진 시간에 자동으로 실행 사용자의 명령이 있을 때 실행 주기적으로 실행 Batch Job을 관리(Job을 구동하거나 실행시키는 기능 X ) Job, Tasklet, Chunk Job 배치 처리 과정을 하나의 단위로 만든 객체 배치 처리 과정에 있어 전체 계층의 최상단에 위치 1개 이상의 Step을 가짐 Job 안에는 여러 개의 Step이 존재하고, Step 안에는 Tasklet 또는 {Reader, Processor, Writer} 묶음이 존..
시간복잡도, 시간제한, 빅오(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..
[gRPC] gRPC 개요, MSA 서비스간 통신, gRPC vs REST
·
MSA
마이크로 서비스간 통신 이슈 MSA에서는 여러 모듈로 분리되어있고 동일 머신에 존재하지 않을 수 있습니다. 따라서 일반적으로는 보편화된 방식인 REST 통신을 통해 메시지를 주고 받습니다. TTP 1.0은 요청/응답을 하기에 앞서 매번 Connection을 맺고 끊어야했기 때문에 연결 요청/해제 비용이 상당히 높았습니다. RPC Remote Procedure Calls 다른 컴퓨터의 프로그램의 프로시저를 실행하는 프로그램을 허용하는 프로토콜 개발자가 원격 상호 작용에 대한 세부 정보를 명시적으로 코딩하지 않아도 됨 프레임워크가 자동 핸들링 클라이언트 코드에서는 직접 서버 코드의 함수를 호출하는 것처럼 보임 gRPC google Remote Procedure Call 구글에서 만든 원격 프로시저 호출 프레..
파이썬 내장함수 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)
[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 ┃ ┃ ┗ ?..
[24042번] 횡단보도(다익스트라)
·
Graph
24042번: 횡단보도 당신은 집으로 가는 도중 복잡한 교차로를 만났다! 이 교차로에는 사람이 지나갈 수 있는 $N$ 개의 지역이 있고 그 지역 사이를 잇는 몇 개의 횡단보도가 있다. 모든 지역은 횡단보도를 통해 직, www.acmicpc.net 분석 시간 역행 불가, 이미 지난 가중치로 지나갈 수 없음 ➔ 주기 이전 소요 시간 ≤ 지금 이용하는 시간 값이 될 때까지 M을 여러 번 더하여(곱하여) 사용 풀이 import heapq import sys input = sys.stdin.readline n, m = map(int, input().split()) graph = [[] for _ in range(n+1)] for i in range(m): a, b = map(int, input().split())..
[Spring WebFlux] 3. Non-Blocking, WebClient, Mono, subscribe
·
Spring
2024.06.10 - [CS/OS] - 동기 VS 비동기, 블로킹 VS 논블로킹 동기 VS 비동기, 블로킹 VS 논블로킹동기(Synchronous) vs 비동기(Asynchronous)Synchronous작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함Thread1이 작업을 시작시키고, Task1이 끝날때까지 기다렸다 Task2를 시작작업 요청을karla.tistory.com  본사에서 클라이언트로부터 도서 정보 조회 요청을 받으면 지점으로 도서 정보 조회 API 요청 보내는 예시코드(클라이언트 ↔️ 본사 ↔️ 지점) Spring MVCBlocking 방식: 스레드가 차단됨다섯개의 책을 조회하는 API호출 지연시간 : 약 25초 정도(호출당 5초 지연)// 본사 API Server: R..
Kubernetes 인그레스(Ingress), 로드밸런서 LoadBalancer, metallb
·
Kubernetes
Ingress, Ingress Controller 인그레스를 사용하면 L7의 웹 요청을 해석해서 단일 IP, 단일 포트로 다수의 도메인과 서비스로 연결할 수 있음 쿠버네티스에서 기본적으로 지원하는 인그레스 오브젝트는 클라우드 환경이 아니면 사용할 수 없음 클라우드에서 인그레스를 생성하면 외부에 게이트웨이를 생성하고 각 기능에 맞게 서비스에 연결 쿠버네티스에서 Ingress를 사용하기 위해서는 두 가지가 필요 첫 번째는 YAML 파일에서 kind: Ingress 로 정의되는 Ingress 오브젝트 두 번째는 Ingress 규칙이 적용될 Ingress Controller YAML 파일로부터 Ingress를 생성해도 아무 일도 일어나지 않음 Ingress는 단지 Ingress 규칙을 정의하는 선언적인 오브젝트..
[Redis] Spring Boot 연동, 객체 캐싱, MSA에서 사용 시 주의점 Serialize
·
Spring
개발환경 macOS Ventura 13.2 Spring Boot 3.0.1 RELEASE JAVA 17 1. Build.gradle Dependency 추가 implementation 'org.springframework.boot:spring-boot-starter-data-redis' 2. application.yml 파일 수정 로컬 레디스 spring: redis: # Local Redis lettuce: pool: max-active: 10 max-idle: 10 min-idle: 2 port: 6379 host: 127.0.0.1 password: 쿠버네티스 레디스 spring: data: # K8s Redis Custer redis: cluster: nodes: - redis-cluster.re..
자바 순열, 조합 구하기 (파이썬 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 ..
GCP GKE Kubernetes 인그레스(Ingress), 노드포트(Nodeport) 접속
·
Kubernetes
MSA (Micro Service Architecture) 로 개발되어 서비스간의 라우팅이 필요한 구조에서는 Ingress 를 사용 Service의 NodePort : 온프레미스 환경에서 사용 Service의 LoadBalancer: 퍼블릭 클라우드 환경에서 사용 Servic는 클러스터 외부로 PORT를 노출하는 기능과 부하분산기능을 수행합니다. 그리고 이점은 Ingress 도 동일합니다. 차이점은 Ingress는 L7이고 Service는 L4라는 점입니다. 1. 노드 포트 2. 파드 생성 (디플로이먼트) vi web-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: web namespace: default spec: selecto..
[1947] 선물 전달하기 (완전 순열, 교란 순열)
·
Combination
1947번: 선물 전달 경우의 수를 1,000,000,000으로 나눈 나머지를 첫째 줄에 출력한다. www.acmicpc.net 분석 완전 순열 : n개의 원소가 모두 자기 자신이 아닌 값으로 배정되는 순열 (모든 원소의 위치를 바꾸는 순열) A가 B에게 선물을 줬다고 가정 1. B도 A에게 선물을 줬을 때 (양방향 교환) : N명 중 2명이 교환을 완료했으므로 남은 경우의 수는 D[N-2] 2. B는 A가 아닌 다른 사람에게 선물을 선달할 때 (단방향 교환) : N명 중 B만 받은 선물이 정해진 상태이므로 남은 학생은 N-1이며 경우의 수는 D[N-1] 풀이 n=int(input()) mod=1000000000 d=[0]*10000001 d[1]=0 # 혼자서는 선물을 교환할 수 없음 d[2]=1 # ..
카드 역배치 (파이썬 리스트 뒤집기)
·
Implement
문제 1부터 20까지 숫자가 하나씩 쓰인 20장의 카드가 아래 그림과 같이 오름차순으로 한 줄로 놓여있다. 구간 [a, b] (단, 1 ≤ a ≤ b ≤ 20)가 주어지면 위치 a부터 위치 b까지의 카드를 현재의 역순으로 놓는다. 현재 카드가 놓인 순서가 위의 그림과 같고 구간이 [5, 10]으로 주어진다면, 위치 5부터 위치 10까지의 카드 5, 6, 7, 8, 9, 10을 역순으로 하여 10, 9, 8, 7, 6, 5로 놓는다. 오름차순으로 한 줄로 놓여있는 20장의 카드에 대해 10개의 구간이 주어지면, 주어진 구간의 순서대로 위의 규칙에 따라 순서를 뒤집는 작업을 연속해서 처리한 뒤 마지막 카드들의 배치 출력 5 10 9 13 1 2 3 4 5 6 1 2 3 4 5 6 1 20 1 20 1 2 3..
[RabbitMQ] rabbitMQ Spring Boot Producer, Consumer 생성, MultipleConsumer, prefetch
·
RabbitMQ
0. RabbitMq 설치 및 설정 [RabbitMQ] rabbitmq 설치 및 설정, rabbitmq spring 3.0이상 연동 1. docker로 Rabbit MQ 설치 컨테이너 이름 : rabbitmq 백그라운드로 실행 docker run -d --name rabbitmq -p 5672:5672 -p 8080:15672 --restart=unless-stopped rabbitmq:management 2. management url 접속 # default username, password는 둘다 gue karla.tistory.com 1. RabbitMqProducer 파일 생성 yml 값 변수 매핑 RabbitTemplate 선언 @Service @Log4j2 public class RabbitM..
[CDC] kafka Connect, Debezium, JDBC Sink Connector
·
Kafka
Confluent 사의 JDBC Sink Connector 통해 구축 Source DB : MySQL Source Connector: kafka Connect (Source Connector, Debezium) Target DB : Mysql, Oracle Sink Connector : kafka Connect (JDBC Sink Connector) 1. Docker Container 주키퍼, 카프카 docker-compose.yml version: "3" services: zookeeper: container_name: zookeeper image: wurstmeister/zookeeper ports: - "2181:2181" kafka: container_name: kafka image: wurstm..
[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..
[JPA] 변경감지 Dirty Checking, @Transactional, @DynamicUpdate
·
JPA
변경감지 변경감지는 트랜잭션 커밋시 영속화된 Entity에서 가지고 있었던 최초 정보(스냅샷)와 바뀐 Entity 정보를 비교해서 바뀐 부분을 update 해주는기능 1. 클라이언트에서 식별자를 포함한 데이터를 넘김 2. 식별자(id)를 통해서 DB에서 데이터 조회 후, 조회된 데이터를 영속화 . 클라이언트에서 넘어온 값들을 토대로 기존의 데이터를 새로운 데이터로 변경 : 변경점 발생 4. 트랜잭션 커밋 5. JPA에서 변경점들을 확인하고 변경해야할 것에 맞게 DB 쿼리를 실행 : 변경 감지 (Dirty checking) 변경감지 조건 변경하려는 Entity가 영속 상태여야함 (영속성 컨텍스트 안에 관리되는 상태) 트랜잭션 안에 묶여 있어야함 트랜잭션이 제대로 커밋되어야함 (그래야 flush가 작동하기 ..
Spring Jsch java ssh 접속
·
Spring
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("StrictHostKeyChecking", "no"); session.connect(); } connectSSH(); // ssh 연결 try { Channel channel = session.openChannel("exec"); // 채널 접속 channelExec = (ChannelE..
Spring websocket 웹소켓, java 채팅 프로그램
·
Spring
웹 소켓 1. WebSocketConfig 생성 MessageBrokerRegistry enableSimpleBroker("/topic"); // 메시지 브로커를 활성화하고 subscribe 메시지 접두사를 설정합니다. setApplicationDestinationPrefixes("/app"); // 클라이언트에서 발송한 메시지중 Destination이 해당 경로(/app)로 시작하는 메시지를 메시지 브로커에서 처리하게합니다. StompEndpointRegistry addEndpoint("/chatting") // 웹소켓 엔드포인트를 지정합니다. 추후 클라이언트에서 해당 경로로 서버와 handshake 하게 됩니다. withSockJS(); // SockJS를 사용하여 브라우저에서 websocket을 지..
[프로그래머스] 코딩 테스트 공부 (DP, 다익스트라)
·
programmers
https://school.programmers.co.kr/learn/courses/30/lessons/118668 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1. DP INF=float('inf') def solution(alp, cop, problems): max_alp=0 # 알고력 max_cop=0 # 코딩력 for a,b,c,d,e in problems: max_alp=max(max_alp, a) max_cop=max(max_cop, b) alp = min(alp, max_alp) cop = min(cop, max_cop) # dp[i][j]..
[Process & Thread] 프로세스간 통신(IPC, 공유메모리, 메시지전달)
·
OS
1. IPC 1) IPC ⭐️ Inter Process Communication 프로세스는 독립적인 주소 공간을 가지고 있어서 다른 프로세스와 데이터를 주고 받을 수 없는데 이런 문제를 해결하기 위한 기법 IPC를 통해 프로세스간 통신이 가능하게 만들어줌 IPC는 크게 공유 메모리 방식과 메시지 전달 방식으로 나눠짐 2. 공유 메모리 1) 공유 메모리 프로세스들이 주소 공간의 일부를 공유하고 공유된 메모리 영역에 읽기와 쓰기를 하면서 통신하는 방식 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해줌 메모리는 스택-힙-데이터-코드영역으로 이루어져있지만 공유 메모리를 할당 받으면 스택-힙-데이터-공유메모리-코드 이렇게 메모리 공간에 공유 메모리 공간이 추가가 됨 2)..
등산경로(DFS)
·
Graph
""" 마을 뒷산의 형태를 나타낸 지도 N*N, 각 구역에 높이 나타남 다른 구역으로 등산을 할 때는 그 구역의 위, 아래, 왼쪽, 오른쪽 중 더 높은 구역으로만 이동 가능 등산로의 출발지는 전체 영역에서 가장 낮은 곳이고, 목적지는 가장 높은 곳 출발지와 목적지는 유일 출발지에서 도착지로 갈 수 있는 등산경로 가지수 출력 첫 번째 줄에 N(5
[11404번] 가장 빠른 버스 노선 구하기(그래프, 최단거리 , 플로이드)
·
Graph
11404번: 플로이드 첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 www.acmicpc.net 플로이드-워셜 시작점 X 모든 노드간에 최단 경로 탐색 시간복잡도 O(V³) 안좋음 ➡️ 노드의 개수 100~200까지 사용 가능 문제 유형 시작점이 없고 모든 도시간의 최단거리, 모든 도시 100개 이하 점화식 D[S][E] = Math.min(D[S][E], D[S][K] + D[K][E]) 원리 리스트를 선언하고 초기화하기 최단 거리 리스트에 그래프 데이터 저장하기 점화식으로 리스트 업데이트하기 더보기 [Step 1] 1번 노드를 거쳐 가는 경우를 고려하여 ..
[RabbitMQ] rabbitmq 설치 및 설정, spring 3.0이상 연동
·
RabbitMQ
1. docker로 Rabbit MQ 설치 컨테이너 이름 : rabbitmq 백그라운드로 실행 docker run -d --name rabbitmq -p 5672:5672 -p 8080:15672 --restart=unless-stopped rabbitmq:management 2. management url 접속 # default username, password는 둘다 guest로 입력 http://localhost:15672/ 3. admin, vhost 추가 (옵션) 4. Queue, Exchange 생성 queue : SKT, KT, LG,emailbroker1, emailbroker2라는 이름의 총 5개의 큐 생성 exchange : SKT, KT, LG 3개의 큐는 각자의 exchage 생성 ..
[graphDB] 그래프 DB, Neo4j , Amazon Neptune
·
DB
graphDB데이터를 노드와 엣지로 표현하는 데이터베이스높은 성능, 복잡한 쿼리 처리 가능대규모의 데이터와 복잡한 관계를 가진 데이터 처리에 적합그래프 데이터 셋의 예시 : 소셜 네트워크 (친구, 좋아요, 댓글 ➡️ 연결되고 그래프를 만듬)노드 및 엣지는 그래프로 구성노드 : 개체엣지: 노드 간의 관계 종류Neo4jAmazon NeptureApache TinkerPopAmazon Nepture완전 관리형 그래프 데이터베이스최대 15개의 읽기 전용 복제본으로 복제고도로 연결된 데이터 셋을 사용하는 애플리케이션 구축, 실행하는데 사용복잡하고 어려운 어려운 쿼리를 실행하기에 최적화최대 수십억 개의 관계를 저장할 수 있고, 그래프 쿼리할 때 지연시간은 밀리초여러 가용 영역에 걸친 애플리케이션에서도 가용성이 높음..
[JPA] @Lock 비관적 락, PESSIMISTIC_WRITE, 타임아웃, 트랜잭션
·
JPA
낙관적 락 @Version을 사용 트랜잭션을 커밋하는 시점에 충돌을 알 수 있음 비관적 락 선점 잠금 데이터베이스 트랜잭션 락 메커니즘에 의존하는 방식 SQL 쿼리에 select for update 구문을 사용하면서 시작 버전 정보는 사용하지 않음 JPA 락 옵션 낙관적 락 OPTIMISTIC 낙관적 락을 사용한다. 낙관적 락 OPTIMISTIC_FORCE_INCREMENT 낙관적 락 + 버전정보를 강제로 증가한다. 비관적 락 PESSIMISTIC_READ 비관적 락, 읽기 락을 사용한다. (공유 잠금) 비관적 락 PESSIMISTIC_WRITE 비관적 락, 쓰기 락을 사용한다.(배타적 잠금) 비관적 락 PESSIMISTIC_FORCE_INCREMENT 비관적 락 + 버전 정보를 강제로 증가한다. 기타 ..
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() :..
[Jasypt] Spring Boot yaml 파일 암호화
·
Spring
Jasypt Java Simplified Encryption의 약자로, 자바로 간단히 암호화할 수 있게 도와주는 라이브러리 파일트리 ├ src │ └─ main │ │ ├─ JasyptConfig.kt │ │ └─ KotlinStudyApplication.kt │ └─ resources │ ├─ application.yml │ └─ jasypt-encryptor-password.txt └─ .gitignore 1. build.gradle에 jasypt-spring-boot-starter 추가 dependencies { implementation ("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3") ... 생략 } 2. yaml 파일에 Jasypt ..
GCP GKE 클러스터 생성 | 구글 클라우드 플랫폼, 쿠버네티스
·
GCP
https://cloud.google.com https://cloud.google.com 영상 통화, 이메일, 채팅, 문서 공동작업을 한곳에 통합할 수 있습니다. cloud.google.com https://console.cloud.google.com Google 클라우드 플랫폼 로그인 Google 클라우드 플랫폼으로 이동 accounts.google.com 1. 새 프로젝트 생성 2. 쿠버네티스 엔진 API 활성화 2. 쿠버네티스 클러스터 만들기 3. 클러스터 생성이 완료되고 3개의 노드가 생성된 것을 확인할 수 있다. 4. 접속 1) 클러스터 연결 2) CLOUD SHELL 3) gcloud CLI https://cloud.google.com/sdk/docs/install gcloud CLI 설치 |..
멀티 스레드 환경, 동시성 이슈, 해결방법 | 스레드 안전성 (Thread-safe)
·
Java
동시성 이슈멀티스레드 방식은 한 코어에서 여러 스레드를 이용해서 번갈아 작업을 처리하는 방식공유하는 영역이 많아 프로세스방식보다 context switcing 오버헤드가 작아, 메모리 리소스가 상대적으로 적다는 장점멀티스레드 프로세스의 경우 여러 스레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 줌여러 스레드가 동시에 하나의 자원을 공유하고 있기 때문에 같은 자원을 두고 경쟁상태(raceCondition) 같은 문제가 발생2023.05.11 - [CS/OS] - [Process & Thread] 스레드, 멀티 스레드 [Process & Thread] 스레드, 멀티 스레드1. 스레드 1) 스레드 하나의 프로세스 내에서 실행되는 동작의 단위 각 스레드는 프로세스의 스택 메모리..
행렬의 곱셈
·
programmers
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr def solution(arr1, arr2): answer = [[0]*len(arr2[0]) for _ in range(len(arr1))] for i in range(len(arr1)): for j in range(len(arr2[0])): for k in range(len(arr1[0])): answer[i][j] += arr1[i][k] * arr2[k][j] return answer def solution(arr1, arr2): return [[sum(a*b for a, b in zip(A_row,B..
유사 칸토어 비트열
·
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..
[1038] 감소하는 수 (백트래킹, 조합, 재귀)
·
Math
1038번: 감소하는 수 음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 www.acmicpc.net 분석 숫자를 덧붙이는 방법으로 한자리, 두자리, 세자리,... 의 감소하는 수 리스트 생성 재귀 n = int(input()) nums = [] def add(idx, num): # 자리수에 따라 증가 if idx == 1: nums.append(num) else: for i in range(num % 10): # 앞자리보다 작은 숫자들만 이어붙이기 add(idx-1, num*10 + i) for i in range(1, 11): for j in ..
[2457] 공주님의 정원
·
Geedy
2457번: 공주님의 정원 첫째 줄에는 꽃들의 총 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 각 꽃이 피는 날짜와 지는 날짜가 주어진다. 하나의 날짜는 월과 일을 나타내는 두 숫자로 표현된다. 예를 들어서, www.acmicpc.net 분석 N개의 꽃들 중에서 3월 1일부터 11월 30일까지 매일 꽃이 한 가지 이상 피어 있도록 꽃들을 선택할 때, 선택한 꽃들의 최소 개수를 출력 풀이 import sys input=sys.stdin.readline n = int(input()) f = [] for i in range(n): sm,sd,em,ed=map(int, input().split()) f.append([sm*100+sd, em*100+ed]) f.sort() start..
[14565] 역원(Inverse) 구하기 (확장 유클리드 호제법)
·
Math
14565번: 역원(Inverse) 구하기 집합 Zn을 0부터 n-1까지의 정수 집합이라고 하자. Zn ∋ a, b, c 일 때, (a+b) mod n = 0이면 b는 a의 덧셈역이라고 하고 (a*c) mod n = 1이면 c는 a의 곱셈역이라고 한다. 정수 N, A가 주어졌을 때 Zn에서의 A의 www.acmicpc.net 분석 덧셈역 n-a (11 + 15) mod 26 = 0 곱셈역 xgcd(11﹡X, 26) = 1이 되는 X를 찾는 것 ➔ 11 * 𝒔 + 26 * 𝒕 = 1일 때 𝑆 값(곱셈역) (11 * 19) mod 26 = 1 확장 유클리드 알고리즘 확장 유클리드 호제법 유클리드 호제법 : 두 수의 최대 공약수 구하기 확장 유클리드 호제법 : 방정식의 해 구하기 베주 항등식 (Bezout's..
[1517] 버블 소트 (병합 정렬, swap 횟수)
·
Sort
1517번: 버블 소트 첫째 줄에 N(1 ≤ N ≤ 500,000)이 주어진다. 다음 줄에는 N개의 정수로 A[1], A[2], …, A[N]이 주어진다. 각각의 A[i]는 0 ≤ |A[i]| ≤ 1,000,000,000의 범위에 들어있다. www.acmicpc.net 분석 N(1 ≤ N ≤ 500,000)이므로 nlogn 병합정렬로 풀이 시간복잡도, 시간제한, 빅오(Big-O) 표기법 1초 제한 n으로 구성된 O( )를 계산했을 때의 값이 1억 정도면 1초 정도의 시간이 걸린다고 한다. 예를 들어 N의 최대값이 10만이라고 문제에서 주어진다면 1. O(N) 의 시간복잡도일 경우에 값이 10만 karla.tistory.com 풀이 """ 1517 N개의 수로 이루어진 수열 A[1], A[2], …, A[..
[11004]K번째 수 (병합 정렬 풀이)
·
Sort
11004번: K번째 수 수 N개 A1, A2, ..., AN이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오. www.acmicpc.net 분석 N(1 ≤ N ≤ 5,000,000)로 nlogn 병합 정렬로 풀이 시간복잡도, 시간제한, 빅오(Big-O) 표기법 1초 제한 n으로 구성된 O( )를 계산했을 때의 값이 1억 정도면 1초 정도의 시간이 걸린다고 한다. 예를 들어 N의 최대값이 10만이라고 문제에서 주어진다면 1. O(N) 의 시간복잡도일 경우에 값이 10만 karla.tistory.com 내장함수 풀이 import sys input=sys.stdin.readline n,k=map(int,input().split()) a=list(map(int..
[14425] 문자열 집합 (트라이, Trie)
·
Tree
14425번: 문자열 집합 첫째 줄에 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)이 주어진다. 다음 N개의 줄에는 집합 S에 포함되어 있는 문자열들이 주어진다. 다음 M개의 줄에는 검사해야 하는 문자열들이 주어 www.acmicpc.net 트라이 문자열 검색을 빠르게 실행할 수 있도록 설계한 트리 형태의 자료구조 특징 N진트리 : 문자 종류의 개수에 따라 N이 결정됨. 예를 들어 알파벳은 26개의 문자로 이뤄져있으므로 26진트리로 구성됨. 루트 노드는 항상 빈 문자열을 뜻하는 공백 상태를 유지 시간복잡도 문자열의 길이가 m이라면 시간 복잡도는 O(m) 현재 노드의 위치를 i, j번째 문자라고 한다면 trie[i][j]의 위치를 조회하는 건 O(1)에 수행 가능 문자열..
[1300] k번째 수 (이분탐색, 2차원 배열)
·
Search
1300번: K번째 수 세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B www.acmicpc.net 분석 n=3, k=7로 가정 중앙값보다 작거나 같은 수의 개수 = 중앙값을 N으로 나눈 값 1. 최초의 중앙값 : 4 = (1+7)/2 1*1 = 1 1*2 = 2 1*3 = 3 1행 : 4/1 = 4지만 행의 크기가 3개이므로 3 2*1 = 2 2*2 = 4 2*3 = 6 2행 : 4/2 = 2 3*1 = 3 3*2 = 6 3*3 = 9 3행 : 4/3 = 1 cnt를 다 더하면 5이므로 k(7)보다 작음 => 중앙값을 증가시킴 ..
역수열
·
Geedy
문제 1부터 n까지의 수를 한 번씩만 사용하여 이루어진 수열이 있을 때, 1부터 n까지 각각의 수 앞 에 놓여 있는 자신보다 큰 수들의 개수를 수열로 표현한 것을 역수열이라 한다. 4 8 6 2 5 1 3 7의 역수열 : 5 3 4 0 2 1 1 0 1보다 큰 수는 4, 8, 6, 2, 5. 이렇게 5개이고, 2보다 큰 수는 4, 8, 6. 이렇게 3개, 3보다 큰 수는 4, 8, 6, 5 이렇게 4개.... n과 1부터 n까지의 수를 사용하여 이루어진 수열의 역수열이 주어졌을 때, 원래의 수열을 출력 첫 번째 줄에 자연수 N(3
동전 교환 (DP)
·
DP
분석 더보기
[2579] 계단오르기
·
DP
2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net """ 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점수를 얻게 된다. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다. 연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다. 마지막 도착 계단은 반드시 밟아야 한다. 계단의 개수는 300이하의 자연수이고, 계단에 쓰여 있는 점수는 10,000이하의 자연수이다. 각 계..
[Process & Thread] Multi Process, Multi Thread 동기화 (Mutex, Semaphore)
·
OS
1. 임계영역 임계영역은 둘 이상의 프로세스나 쓰레드가 동시에 동일한 자원에 접근하게 되는 프로그램 코드 부분을 의미하는데 각 프로세스나 쓰레드가 임계구역에서 일을 수행하는 동안 다른 프로세스나 쓰레드가 그 임계영역에 들어갈 수 없어야 한다. 즉, 임계영역 내의 코드는 원자적 실행이 되야 하는 것이다. 이렇듯, 원자적으로 실행되기 위해 임계영역으로 들어갈 때 entry section을 통해 진입 허가를 요청하게 되고 허가 요청이 수락되면 임계영역을 실행하게 된다. 임계영역에서 수행이 끝나면 exit section으로 퇴출하게 된다. 임계영역의 원자성을 보장함으로써 프로세스나 쓰레드들이 동기화 되도록 할 수 있고 이러한 방법 중 대표적인 방법이 뮤텍스와 세마포어인 것이다. 2. 동기화 멀티 쓰레드인 경우 ..
[2098번] 외판원 순회(TSP, 비트 마스킹)
·
DP
2098번: 외판원 순회 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 16) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j www.acmicpc.net 외판원 순회 (모든 도시를 순회하는 최단 거리) n≤11일 경우: 브루트포스(O(n!)) n≤12일 경우: 백트래킹 n≤16일 경우: DP + BitMasking (n2∗2n) 분석 D[c][v] : 현재 도시 c, 현재까지 방문한 모든 리스트 v, 앞으로 남은 모든 도시를 경유하는데 필요한 최소비용 점화식 : D[c][v] = min(d[c][v], d[i][v|(1
[1722번] 순열의 순서 구하기(수학, 구현)
·
Combination
1722번: 순열의 순서 첫째 줄에 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄의 첫 번째 수는 소문제 번호이다. 1인 경우 k(1 ≤ k ≤ N!)를 입력받고, 2인 경우 임의의 순열을 나타내는 N개의 수를 입력받는다. N개의 수에는 1부터 N www.acmicpc.net 분석 4! = 24 3! = 6 2! =2 1! =1 제일 앞 자리에 사용할 수 있는 숫자 경우의 수 4가지, 다음 3가지, 다음 2가지, 다음 1가지 ➔ N자리의 수로 만들 수 있는 순열의 모든 경우의 수 N! 1. K번째 순열 출력 1) 로직 1. 주어진 값(K)과 현재자리(N) -1에서 만들 수 있는 경우의 수를 비교 2. 1에서 K가 더 작아질 때까지 경우의 수를 배수(cnt)로 증가시킴(순열의 순서를 1씩 늘림) 3. K가..
[1197번] 최소 신장 트리(MST, 크루스칼, 프림, 유니온파인드)
·
Graph
1197번: 최소 스패닝 트리 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 www.acmicpc.net 최소 신장 트리 간선에 가중치를 고려하여 최소 비용의 Spanning Tree를 선택하는 것 그래프에서 모든 노드를 연결할 때 사용된 에지들의 가중치의 합을 최소로 하는 트리 사이클이 포함되면 가중치의 합이 최소가 될 수 없으므로 사이클을 포함하지 않음 N개의 노드가 있으면 최소 신장 트리를 구성하는 에지의 개수는 항상 N-1 더보기 크루스칼 알고리즘 간선 위주의 알고리즘 시작점을 따로 정하지 않고 최소 비용의 간선..
[Apache POI] Spring Boot 엑셀 다운로드
·
Spring
설문조사 시스템에서 설문조사의 총 결과 데이터를 엑셀로 한눈에 볼 수 있도록 하는 기능을 추가했다. 첫 행은 설문조사의 문항, 두번째 행부터 설문조사의 답변을 조회할 수 있다. 1. pom.xml dependency 추가 org.apache.poi poi 3.13 org.apache.poi poi-ooxml 3.13 2. application.yml 추가 spring: mvc: contentnegotiation: favor-parameter: true favor-path-extension: true media-types: xls: application/vnd.ms-excel 3. ExcelService 생성 및 엑셀 다운로드 함수 추가 0) 조회할 설문의 데이터(SurveyDTO), 질문과 답변 데이터를..