📌 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: ..

서론문제는 N 배열에서 M배열의 각각의 값이 몇개 존재하는지 출력하면 되는 간단한 문제이다.다만 N과 M의 범위가 각각 500,000으로 경우의 수가 상당히 많아지기 때문에 시간복잡도가 관건이라고 생각했다.역시나 일반적인 풀이로는 시간 초과 1. count를 이용한 풀이import sysinput = sys.stdin.readlinen = int(input())n_array = list(map(int, input().split()))n_array.sort()m = int(input())m_array = list(map(int, input().split()))m_array.sort()for i in m_array: print(n_array.count(i), end=" ") sort를 통해 시간을 단축..