본문 바로가기

분류 전체보기

(90)
[Spring] 트랜잭션 1. 트랜잭션 코드와 비즈니스 로직의 결합 문제다음 코드는 트랜잭션 관리 로직과 비즈니스 로직이 혼재되어 있어 코드의 복잡성과 책임이 증가하는 예입니다.public void addUsers(List userList) { TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition()); try { for (User user : userList) { if (isEmailNotDuplicated(user.getEmail())) { userRepository.save(user); } } ..
[알고리즘] KMP 알고리즘 KMP 알고리즘은 Knuth-Morris-Pratt라는 세 명의 컴퓨터 과학자가 1977년에 개발한 문자열 검색 알고리즘입니다. 이 알고리즘은 주어진 텍스트 문자열에서 특정 패턴(부분 문자열)이 존재하는 위치를 찾는 문제를 효율적으로 해결합니다. 기본적인 아이디어는 이미 비교한 부분을 재사용하여 중복된 작업을 피하는 것입니다. KMP 알고리즘은 문자열 검색 시 불필요한 비교를 최소화하는 방식으로 작동합니다. 기존의 방법처럼 단순히 한 글자씩 이동하면서 다시 처음부터 비교하는 것이 아니라, 접두사와 접미사 정보를 활용해 효율적으로 패턴을 이동시킵니다. KMP 알고리즘의 특징시간 복잡도: KMP 알고리즘은 패턴과 텍스트의 길이에 비례하는 선형 시간 복잡도인 O(n + m)를 가집니다. 여기서 n은 텍스트 길..
[알고리즘] 라빈-카프 알고리즘 라빈-카프(Rabin-Karp) 알고리즘은 1987년 리처드 M. 카프와 마이클 O. 라빈에 의해 개발된 문자열 검색 알고리즘입니다.이 알고리즘은 주어진 텍스트에서 특정 패턴 문자열을 효율적으로 찾기 위해 해싱(Hashing) 기법을 활용합니다.특히, 롤링 해시(rolling hash)라는 기법을 사용하여 텍스트의 각 위치에서 패턴과의 일치 여부를 빠르게 확인할 수 있습니다. 라빈-카프 알고리즘의 기본 개념은 텍스트와 패턴을 비교할 때, 각 문자를 일일이 대조하는 대신,텍스트의 부분 문자열과 패턴의 해시 값을 비교함으로써 비교 과정을 단순화하는 것입니다.해시 값이 일치하는 경우에만 실제 문자열 비교를 수행하여, 불필요한 비교를 줄이고 속도를 높입니다.이 과정에서 롤링 해시를 사용하여 이전에 계산된 해시 ..
[백준 JAVA] 14502. 연구소 문제 링크https://www.acmicpc.net/problem/14502접근 방법세울 수 있는 모든 조합으로 벽을 만듭니다 (브루트 포스). 이때, 세웠던 조합으로 다시 세우지 않도록 합니다.벽 3개를 세울 때마다 바이러스를 퍼뜨립니다. 소스 코드import java.util.*;import java.io.*;public class Main { static List virus = new LinkedList(); // 바이러스의 위치를 저장하는 리스트 static int[] dy = {0, 0, -1, 1}, dx = {1, -1, 0, 0}; static int[][] map; static int y, x, max = 0, safe = 0; public static void..
[백준 JAVA] 1916. 최소비용 구하기 문제 링크https://www.acmicpc.net/problem/1916접근 방법다익스트라 문제입니다.소스 코드import java.util.*;import java.io.*;public class Main { static class Node implements Comparable { int v, cost; public Node(int v, int cost) { this.v = v; this.cost = cost; } @Override public int compareTo(Node other) { return this.cost - other.cost; } } ..
[백준 JAVA] 18352. 특정 거리의 도시 찾기 문제 링크https://www.acmicpc.net/problem/18352 접근 방법모든 도로의 거리는 1로 동일하므로 다익스트라가 아닌 bfs로 접근합니다.소스 코드import java.util.*;import java.io.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int city, road, d, s; StringTokenizer st = new StringTokenizer(br.readLine()); city..
[백준 JAVA] 23970. 알고리즘 수업 - 버블 정렬 3 문제 링크https://www.acmicpc.net/problem/23970접근 방법배열 A와 B가 같은지 확인하는 횟수를 최대한 적게 합니다.소스 코드import java.util.*;import java.io.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); String[] tmp = br.readLine().split(" "); int[] a = ..
[백준 JAVA] 1753. 최단경로 문제 링크https://www.acmicpc.net/problem/1753접근 방법다익스트라 문제입니다.소스 코드import java.util.*;import java.io.*;public class Main { static class Node implements Comparable { int v, cost; public Node(int v, int cost) { this.v = v; this.cost = cost; } @Override public int compareTo(Node other) { return this.cost - other.cost; ..