본문 바로가기

공부-코딩테스트/코테에 도움이 될만한 지식들7

DP 동적계획법 메모리 공간은 더 쓰지만 연산 속도 향상에 쓸 수 있는 기법 이미 계산된 결과를 메모리에 저장, 다시 계산하지 않도록 한다. 큰 문제를 해결하는데 작은문제를 먼저 해결하고 이러한 결과가 모여 문제를 해결해야 할 때 다른 경우의 수에서도 이전에 사용한 결과를 활용해야 할 때 DP는 구현하는데 사용하는 코드가 어렵다기 보다는 개념이 어려운 문제라고 생각한다. DP문제를 풀면서 실수했던 것이나 접근법 등을 정리해서 되새기는 것이 중요하다고 생각했다. 실수했던 문제 12865 평범한 배낭 무게가 W일 때 for문에서 W부터 시작한다면 W*2가 최대 무게보다 작다면 중복으로 계산하게 된다. 최대무게에서부터 먼저 접근하고 감소하는 형태로 구현해야 중복되는 경우가 없다. 해결한 코드 2023. 1. 17.
LIS문제 -DP LIS문제: 최장 증가 부분 수열 배열의 일부분을 순서대로 추출했을 때 크기가 커지는 배열들의 집합 중에서 가장 길이가 긴 수열 찾기 문제의 답은 여러개가 될 수 있다. [8, 2, 6, 5, 4, 9, 2, 7, 5, 1] 배열이 있다면 [2, 4, 9] 배열은 정답 후보에 있을 수 있다. 생각해보면 커지는 것을 발견하면 선택하는 식으로 해결한다면? [1,2,9, ~~~] 에서 9를 선택했는데 ~~~부분이 3,4,5,6,7 이렇게 더 긴 조합을 생성할 수 있으므로 유의해야 한다. DP [8, 2, 6, 5, 4, 9, 2, 7, 5, 1] 8이 배열의 마지막인 배열들 중 가장 길이가 긴 것은 [8] 하나밖에 없다. [8, 2, 6, 5, 4, 9, 2, 7, 5, 1] 2가 배열의 마지막인 부분배열들 .. 2022. 10. 6.
BFS DFS 자바코드 가장 기초적인 BFS,DFS 알고리즘이 빠져있었다. 오랜만에 봤는데 기억이 잘 안나서 설명보단 코드를 기재한다. import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; public class BFS_DFS { static int[][] map; static boolean[] visit; static int N = 7; static int[] edge(int a,int b) { int[] re = {a,b}; return re; } public static void main(String[] args) { map = new int[7][7]; ArrayList edge = new ArrayList(); edge.add(.. 2022. 9. 30.
벨만 포드, 다익스트라, 프로이드 워샬 알고리즘 벨만 포드 알고리즘 다익스트라 문제처럼 한 지점에서 다른 지점까지의 최단 경로들을 구할 때 사용하는 알고리즘 다익스트라와 차이점은 가중치에 음수가 있는 경우에는 다익스트라를 쓰면 안되므로 벨만 포드 알고리즘을 쓴다. 다익스트라보다 구현은 훨씬 쉽다. 단순하게 (노드수-1)번만큼 반복하는데 반복하는 일은 다음과 같다. 방문한 노드에서 뻗어나오는 간선들을 통해서 최단경로가 갱신되는지 연산 시작하는 노드는 방문한 노드라고 처음에 설정하고 시작한다. 모든 간선을 확인할 필요는 없고 방문했던 노드와 연관된 간선들만 확인하면 되긴 하다. 벨만 포드 알고리즘 자체라고 생각하는 문제는 백준의 타임머신 문제이다. 11657번: 타임머신 첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ .. 2022. 9. 28.
연결된 그래프 합쳐졌는지 체크 (feat. 행성 터널 문제) 문제를 풀다보면 엣지와 간선이 주어졌을 때 가중치에 따른 간선선택상황이 올 수 있다. 간선 정보들이 매우 많을 때 적절히 정렬되어 있다고 가정했을 때, 필요없는 간선인지 판단하는 것과, 간선 선택시 상황을 기억하고 있는 정보들을 업데이트를 해야할 것이다. ex) 0 -1 , (2-3, 3-4) 로 연결되어 있었고 1-4간선을 발견하였다. 1-4 연결이 되면 두 집합이 하나로 합쳐졌다고 정보를 수정해야 한다. parent = new int[N]; //parent[i] = i 라고 생각 while (!queue.isEmpty()) { Edge tmp = queue.poll(); if (!isSameParent(tmp.s, tmp.d)) { System.out.println(tmp.s + " " + tmp.d.. 2022. 8. 21.
세그먼트 트리 : 구간별로 비교할 경우 (feat. BOJ : 히스토그램에서 가장 큰 직사각형 ) 세그먼트 트리의 원리 : 연속된 구간의 데이터의 합을 가장 빠르고 간단하게 구할 수 있는 트리 원리는 쉽다. 입새노드를 좌에서 우로 순서대로 배치한다. 트리의 크기는 아무리커도 배열크기의 원소들이 입새노드가 될 수 있으면 된다. 아래 식을 확인해보면 이해할 수 있다. 부모노드는 자식노드의 합산으로 결정되고 부모값이 의미하는 바는 자식노드들의 합산이 된다. 부모노드들은 결국 해당구간의 합산을 기억하고 있으며 필요한 범위를 지정하면 접근하도록 구현하면 완성된다. 편의를 위해 루트노드의 인덱스는 1로 왼쪽 자식은 *2 , 오른쪽 자식은 *2+1 한값을 기억하도록 한다. 코드 : 자바 int h= (int) Math.ceil(Math.log(N)/ Math.log(2)); h = (int)Math.pow(2, .. 2022. 8. 20.