본문 바로가기

전체 글

(84)
[Java] KMP algorithm - A문자열에서 B문자열의 등장 횟수 https://coding-food-court.tistory.com/220 접두사, 접미사를 이용한, KMP 문자열 매칭 알고리즘 2 with Java KMP 문자열 매칭 알고리즘 오늘은 문자열 찾기 알고리즘인 KMP(Knuth-Morris-Pratt) 알고리즘에 대해서 공부 하겠습니다. ​ ​ 1. 문자열 매칭(String Matching) 우리들이 흔히들 사용하는 브라우저에서 Ctrl coding-food-court.tistory.com import java.util.*; import java.io.*; public class KMP{ static FastScanner fs = new FastScanner(); static BufferedReader br = new BufferedReader(new ..
[Java] 백준 1786번 찾기 - KMP https://www.acmicpc.net/problem/1786 1786번: 찾기 첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 공백으로 구분해 출력한다. 예컨대, T의 i~i+m-1번 문자와 P의 1~m www.acmicpc.net KMP 알고리즘을 사용해야 한다. 역시 기초만 다루는데도 어려워서 플5로 책정되어있다 import java.util.*; import java.io.*; public class p1_1786{ static FastScanner fs = new FastScanner(); static BufferedReader br = new BufferedReader(new InputStreamReader(S..
[Java] Fenwick Tree(Binary Indexed Tree, BIT) - O(lgN)의 부분합 계산 https://www.acmicpc.net/blog/view/21 펜윅 트리 (바이너리 인덱스 트리) 블로그: 세그먼트 트리 (Segment Tree) 에서 풀어본 문제를 Fenwick Tree를 이용해서 풀어보겠습니다. Fenwick Tree는 Binary Indexed Tree라고도 하며, 줄여서 BIT라고 합니다. Fenwick Tree를 구현하려면, 어떤 수 X www.acmicpc.net https://www.acmicpc.net/problem/2042 2042번: 구간 합 구하기 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그..
[Java] Knapsack Problem - 배낭 문제(DP) https://gsmesie692.tistory.com/113 Dynamic Programming: 배낭 채우기 문제 (Knapsack Problem) 도둑이 보석가게에 배낭을 메고 침입했다. 배낭의 최대 용량은 W이며, 이를 초과해서 보석을 담으면 배낭이 찢어질 것이다. 각 보석들의 무게와 가격은 알고 있다. 배낭이 찢어지지 않는 선에서 gsmesie692.tistory.com i번 물품의 무게만큼 비운 경우의 최대 가치 + i번 물품의 가치 vs i번 물품을 그냥 안담을 경우의 가치 (상기용) ---------------------------------------------------------------------------------------------------------------------..
[Java] 백준 11444번 피보나치 수 6 - 도가뉴 항등식 https://www.acmicpc.net/problem/11444 11444번: 피보나치 수 6 첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net n번째 피보나치 수를 찾아야 하는데, n의 최대값이 1,000,000,000,000,000,000이다. long 최대 범위 근접하는 엄청난 범위라서 도가뉴 항등식을 사용해야 한다. 단순히 재귀만 사용하면 시간복잡도를 많이 줄일 수가 없어서 TreeMap에 각 피보나치 수를 저장한다. 이미 저장된 값이 있다면 조회만 하면 끝! 시간복잡도 관리의 중요성을 상기시켜주는 문제였다. 참고로 m이 n보다 크거나 같아야 잘 동작하게 짜놓았다. import java.util.*; impo..
[Java] LIS - 최장 증가 부분 수열 https://sskl660.tistory.com/89 [Java]최장 증가 부분 수열(LIS, Longest Increasing Subsequence) *최장 증가 부분 수열(LIS, Longest Increasing Subsequence) ->최장 증가 부분 수열이란, 주어진 수열에서 오름차순으로 정렬된 가장 긴 부분 수열을 찾는 문제이다. 여기서 부분 수열은 연속적이거나, sskl660.tistory.com https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 ..
[Java] LCS - 최장 공통 부분 수열 https://st-lab.tistory.com/139 [백준] 9251번 : LCS - JAVA [자바] www.acmicpc.net/problem/9251 9251번: LCS LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAY.. st-lab.tistory.com 두 문자열 a,b가 주어졌을 때 각 문자열로 만들 수 있는 부분집합들 중 일치하는 것들의 최장 길이를 찾아낸다. 무식하게 박치기하면 원래 지수적으로 걸리던 문제인데 O(len(a) * len(b)) 까지 줄여주는 놀라운 방법이다.
[Java] 백준 2263번 트리의 순회 - 분할정복법 https://www.acmicpc.net/problem/2263 2263번: 트리의 순회 첫째 줄에 n(1 ≤ n ≤ 100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다. www.acmicpc.net Inorder, Postorder를 보고 Preorder의 순서를 예상해 출력하는 문제다. Postorder의 마지막에 root가 들어온다는 점을 이용해 Inorder에서 루트의 위치를 찾아 그를 중심으로 두 개의 트리로 분할해서 분할정복하는 문제였다. package class4; import java.util.*; import java.io.*; public class g2_2263{ static FastScanner f..