본문 바로가기

중요한건 꾸준함!10

[알고리즘] LIS - 최장 증가 부분 수열(dp,이진탐색,수열 복원) LIS (최장 증가 부분 수열: Longest Increasing Subsequence)LIS란 최장 증가 부분 수열로 어떤 수열에서 오름차순으로 정렬된 가장 긴 부분 수열을 의미한다.여기서 부분 수열이란 원소의 순서를 유지한 채, 일부 원소를 골라 만든 수열이다.수열: [10, 20, 10, 30, 20, 50]LIS: [10, 20, 30, 50] → 길이 4구현 방법일반적으로 DP와 이진 탐색을 이용해서 구현할 수 있다.DP: O(n²)이진 탐색: O(n log n)DP로 구현하기int[] dp = new int[n];Arrays.fill(dp, 1); // 최소 길이 1for (int i = 0; i i 번째 까지 반복하면서 이전 인덱스 j 들을 확인한다.arr[i]가 arr.. 2025. 4. 21.
[BOJ] 백준 17961 흩날리는 시험지 속에서 내 평점이 느껴진거야 (Java) https://www.acmicpc.net/problem/17951 문제 설명Parametric Search (매개변수 탐색) 문제이다.주어진 시험지 점수를 나누어 여러 부분합을 만들 때, 최소 부분합이 최대가 되도록 나누는 문제이다. 누적합을 이용해 각 구간의 합을 계산하고, 구간의 합이 현재 mid 값보다 크거나 같으면 해당 구간을 하나로 묶고 구간의 개수를 증가시킨다. 그 후, mid 값을 변경하며 원하는 개수의 구간이 나오도록 하고, 이때 최소 부분합이 최대가 되는 mid 값을 찾아내면 된다. 문제 풀이8 312 7 19 20 17 14 9 10 k값이 3인경우를 생각해보자 첫 번째 이진 탐색:start = 0, end = 108, mid = (0 + 108) / 2 = 54부분합 계산:첫 번째 .. 2025. 1. 2.
[BOJ] 백준 6443 애너그램 (Java) https://www.acmicpc.net/problem/6443 문제 풀이 1 (오답)문제에서 단어의 길이는 20보다 작고, 애너그램의 수가 100,000개 이하라고 했다.그래서 단순한 완전 탐색 문제라고 생각을 했고 입력 받은 문자열을 순열로 돌려 Set에 넣어 중복을 제거했다.하지만 메모리 초과가 발생했다. 100,000개 이하라고해서 메모리 초과가 발생하지 않을것이라고 생각했다.하지만 aaaabbbbbbbccccccc 와 같이 중복이 많은 문자열이 입력으로 들어온다면 애너그램의 수는 적지만 메모리는 터질것이다. 문제 풀이 2 (prev 사용)따라서 중복을 해결하기 위해 prev 변수를 사용해서 중복된 문자 처리를 건너뛰었다. public static void dfs(int depth) { i.. 2024. 12. 12.
[C++ STL] next_permutaion next_permutaion 순열과 조합 관련 문제를 풀때 C++의 next_permutaion을 사용하면 더 편리하게 해결할 수 있다. #include algorithm 헤더를 추가해줘야 한다. next_permutation은 다음 순열이 존재하면 해당 배열을 다음 순열로 변환하고 true를 리턴 한다. 다음 순열이 존재하지 않으면 다시 첫번째 순열로 변환하고 false를 리턴한다. 순열 next_permutation은 다음 순열이 존재하면 true를 리턴하고 다음순열로 변환 시켜주기 때문에 do~while문을 사용하면 쉽게 순열을 구할수 있다. #include #include using namespace std; int main() { int a[3] = { 1,2,3 }; do { for (int .. 2024. 4. 16.
순열(15649), 조합(15650) (c++) 순열 구현 문제 https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net #include #include #include using namespace std; int n, m; int arr[9] = {}; bool visited[9] = {}; void dfs(int depth) { if (depth == m) { for (int i = 0; i < m; i++) { cout m; dfs(0); return 0; } 조합 구현 문제 https://w.. 2023. 4. 28.
[c++ STL]vector sort() 함수와 compare 함수 vector sort() 함수 vector vec sort(vec.begin(),vec.end()); #include 헤더파일을 추가하면 사용 할 수있다. 기본적으로 vector에서 sort() 함수는 다음과 같이 사용된다. 디폴트로 오름차순으로 정렬이 된다 (1,2,3,4,5) vector sort() 내림차순 sort(vec.begin(),vec.end(),greater()); 다음과 같이 greater()을 추가해주면 내림차순으로 정렬 할 수있다.(5,4,3,2,1) compare 인자 sort(vec.begin(), vec.end(), compare); greater()과 같이 compare를 추가해주면 sort 함수를 변형 할 수 있다.(compare()이 아닌 compare 이다.) 예시 ve.. 2023. 4. 11.
트리 트리 트리의 개념 트리는 노드로 이루어진 자료구조로 스택이나 큐와 같은 선형 구조가 아닌 비선형 구조이다. 트리는 그래프의 한종류이다.(그래프와 다르게 사이클이 없다, 그래프는 사이클이 존재할 수 있음) 루트 노드, 부모-자식 개념이 존재한다.(그래프는 루트 노드 개념X, 부모-자식 개념X) 노드가 n개인 트리는 간선의 개수가 n-1이다 이진트리, 이진포화트리 (자식 노드가 최대 2개) 등이 존재한다. 트리 순회 전위 순회 루트 - 왼쪽 - 오른쪽 C-B-A-E-D-F-G C-B-A-1-2-3-E-D-4-5-F-6-G-7-8 중위 순회 왼쪽 - 루트 - 오른쪽 A-B-C-D-E-F-G 1-A-2-B-3-C-4-D-5-E-6-F-7-G-8 후위 순회 왼쪽 - 오른쪽 - 루트 A-B-D-G-F-E-C 1-2.. 2023. 4. 3.
이분 그래프 이분 그래프 이분 그래프의 개념 인접한 정점끼리 서로 다른색으로 칠했을때 모든 정점을 두가지 색으로만 칠할 수 있는 그래프 잘 이해가 안간다면 그림을 살펴보자. BFS,DFS 모두 이용해서 구현할수 있다. 이분 그래프 코드 bool check(int v) { queue que; for (int i = 1; i if (visited[next] == 0) , queue에 push를 하고 visited[next] = visited[x] * -1; visited[next] = visited[x] * -1; 이 코드의 의미는 -1 를 곱해줌으로써 1과 -1이 반복되게 만들어준다. 만약 해당 노드를 이미 방문 했는데 visited[next] == visited[x] 일 경우, 이분그래프가 아니라는 의미의 false.. 2023. 3. 27.
인접행렬과 인접리스트 인접행렬 그래프의 노드(정점)가 v개 일 경우 v*v의 2차원 배열로 나타낸다. 두 노드 a,b가 연결되어 있을 경우 graph[a][b] ,graph[b][a] 의 값을 1로 저장 해주고, 연결이 안되어있을 경우 0을 저장한다. graph[v][v] = {}; for (int i = 0; i > a >> b; graph[a][b] = 1; graph[b][a] = 1; } 다음과 같이 노드의 개수가 v개일 경우 v*v의 2차원 배열을 0으로 초기화 해주고 간선의 개수가 e개 일때 e번 입력을 받아 연결되어있는 노드의 graph값을 1로 저장해준다. 인접리스트 vector graph[v]; for (int i = 0; i < e; i++) { int a, .. 2023. 3. 27.