개발팀에서 가장 많이 고민하는 것 중 하나가 바로 브랜치 전략입니다. 특히 Git Flow와 GitHub Flow는 가장 널리 사용되는 두 가지 방식인데, 각각의 특징과 장단점을 이해하고 프로젝트에 맞는 전략을 선택하는 것이 중요합니다.🌊 Git Flow란?Git Flow는 Vincent Driessen이 2010년에 제안한 브랜치 모델로, 복잡하지만 체계적인 브랜치 구조를 가지고 있습니다.Git Flow의 브랜치 구조master (main) ──●────●────●────●── │ │ │ │release ─┴●───┴●───┴●───┴── │ │ │develop ..

전체 글
안되는건 없다 모를 뿐이지📌 OSIV란 무엇인가?**OSIV(Open Session In View)**는 Spring Boot에서 기본적으로 활성화되어 있는 기능으로, HTTP 요청이 시작될 때부터 응답이 완료될 때까지 JPA 영속성 컨텍스트(EntityManager)를 열어두는 전략입니다.OSIV의 동작 방식# Spring Boot 기본 설정 (OSIV 활성화)spring: jpa: open-in-view: true # 기본값// OSIV가 켜져있을 때의 동작@GetMapping("/api/orders")public List getOrders() { List orders = orderService.findAll(); // 🎯 여기서도 지연 로딩 가능! (OSIV 덕분) return order..
IntelliJ IDEA Spring 개발 단축키 가이드Spring 개발 시 IntelliJ IDEA에서 자주 사용하는 편의 단축키들을 정리했습니다. 이 단축키들을 익히면 개발 생산성을 크게 향상시킬 수 있습니다.🔍 검색 및 네비게이션빠른 검색Ctrl + N (Windows/Linux) / Cmd + O (Mac): 클래스 검색Ctrl + Shift + N (Windows/Linux) / Cmd + Shift + O (Mac): 파일 검색Ctrl + Alt + Shift + N (Windows/Linux) / Cmd + Alt + O (Mac): 심볼 검색Ctrl + Shift + A (Windows/Linux) / Cmd + Shift + A (Mac): 액션 검색코드 네비게이션Ctrl + B (Wi..
import sysfrom collections import dequeinput = sys.stdin.readlinen, m, v = map(int, input().split())graph = [[] for _ in range(n + 1)]visited_dfs = [False] * (n + 1)visited_bfs = [False] * (n + 1)for i in range(m): a, b = map(int, input().split()) graph[a].append(b) graph[b].append(a)for i in range(n+1): graph[i].sort()def dfs(x): visited_dfs[x] = True print(x, end=" ") for ..
1. 문제 검토제시된 N과 M이 각각 100,000까지 될 수 있으므로 시간 복잡도상 일반적인 풀이는 일반적인 sum으로는 불가능할 것으로 보였다.역시나 아래 sum을 활용한 풀이는 시간초과import sysinput = sys.stdin.readlinen,m = map(int,input().split())ij = list(map(int, input().split()))print(ij)for i in range(m): a, b = map(int,input().split()) print(sum(ij[a-1:b]))2. 누적합을 이용한 풀이import sysinput = sys.stdin.readlinen,m = map(int,input().split())arr = [0]arr += list(ma..
1. DFS를 활용한 풀이import sysinput = sys.stdin.readlinen = int(input())k = int(input())graph = [[] for _ in range(n+1)]visited = [False] * (n+1)cnt = 0# 각 노드들 마다 연결된 값 append# graph 완성for i in range(k): a, b = map(int,input().split()) graph[a].append(b) graph[b].append(a)# dfs구현def dfs(virus): # def 안에서 cnt를 사용하기 위해 global 적용 global cnt # 방문한 노드를 True로 변경 visited[virus] = True ..
DP란?DP란 메모리 [ex) 데이터를 담아놓을 수 있는 변수 등]에 저장하여 수행시간을 비약적으로 향상시키는 방법연속적인 연산에 있어서 이미 계산된 결과를 메모리에 저장하여 다시 계산하지 않고 활용Top-Down, Bottom-Up 방식이 있음DP 알고리즘을 사용해야 하는 경우최적 부분 구조 : 큰 문제를 작은 문제로 나눌 수 있고, 작은 문제를 모아서 큰 문제를 해결할 수 있는 경우중복되는 부분 문제 : 동일한 문제를 반복적으로 해결해야 하는 경우DP 알고리즘을 사용해야 할 경우 가장 먼저 해야할 것제시된 문제에서 문제 해결을 위해 필요한 '일정한 규칙'을 찾고 이를 위한 점화식을 도출
import sysinput = sys.stdin.readlinen = int(input())# 계단의 점수를 저장. 1층 부터 저장한다.stairs = [0] * 301for i in range(1, n + 1): stairs[i] = int(input())# 첫 번째 칸은 3칸 연속 밟을 수 없는 규칙에 해당하지 않음dp = [0] * 301dp[1] = stairs[1]dp[2] = stairs[1] + stairs[2]dp[3] = max(stairs[1] + stairs[3], stairs[2] + stairs[3])# 점화식을 계산for i in range(4, n + 1): # 계단은 3칸 연속 오를 수 없음 # 1. 현재 계단의 3칸 전까지의 dp값 + 한칸 전의 점수 + 현재 ..
import sysinput = sys.stdin.readline# dp는 연산 횟수의 최솟값 리스트dp = [0] * 1000001 n = int(input())# n이 1일 경우 아무런 연산할 필요 없이 연산 횟수는 0# 따라서 2부터 시작for i in range(2, n+1): # 1. 1을 빼는 경우 dp[i] = dp[i-1] + 1 # 2. 2로 나누는 경우 if i % 2 == 0: # 1번 경우와 2번 경우를 비교하여 작은 값을 dp[i]에 담는다 dp[i] = min(dp[i], dp[i//2] + 1) # 3. 3으로 나누는 경우 if i % 3 == 0: # 위에서 구한 연산 횟수와 3번..
import sysinput = sys.stdin.readlinen, m = map(int, input().split())pocket = {}for i in range(n): name = input().rstrip() pocket[i+1] = name# reversed로 dictionary의 key와 value를 바꿔줄 수 있음pocket_reversed = dict(map(reversed, pocket.items())) for _ in range(m): x = input().rstrip() # isdigit()으로 숫자 형식인지 판별 if x.isdigit(): x = int(x) print(pocket[x]) else: ..