본문 바로가기
반응형

Programming456

[C/C++] 백준 #2661 좋은수열(백트래킹) 이번 문제는 백트래킹을 이용해서 문제를 풀었습니다.현재 위치가 올바른지 아닌지를 검사하는데, 조금 더 우수한 알고리즘을 이용했다면, 더 좋게 할 수 있겠지만, 저는 단순한 알고리즘을 이용했습니다.  더 좋은 알고리즘을 찾기 위해서 노력을 안 한 것도 있었겠지만, 글을 쓰는 시점에서 생각해도 좋은 알고리즘을 찾는 것이 쉽지는 않습니다.  https://www.acmicpc.net/problem/2661#### 1. `solve` 함수이 함수는 재귀적으로 좋은 수열을 생성하는 역할을 합니다. 함수의 매개변수는 다음과 같습니다:- `v[]`: 현재까지 생성된 수열을 저장하는 배열- `c`: 현재까지 생성된 수열의 길이- `n`: 생성하고자 하는 수열의 길이bool solve(int v[], int c, int.. 2024. 5. 30.
[C/C++] 백준 #2660 회장뽑기(플로이드-워샬) #2660 문제는 복잡하게 설명을 했지만, 결국 모든 간선의 웨이트가 1인 그래프에서 경로의 합 중 가장 적은 경로의 합을 가진 사람을 찾는 문제입니다.  모든 그래프의 노드들과 노드들간의 경로를 구하기 위해서는 가장 적합한 그래프 알고리즘은 플로이드-워샬 알고리즘입니다.  여기에는 선택의 여지가 없는데, 다음에 회장 후보들을 선택하기 위해서는 나름대로의 알고리즘을 구성해서 해야 합니다. 플로이드-워샬 알고리즘이 \(O(N^3)\)이기 때문에 플로이드-워샬 알고리즘의 결과를 순회하는 것으로 작성한다면, 해당 시간복잡도가 \(O(N^2)\)이므로 시간복잡도상으로는 큰 문제가 없습니다. https://www.acmicpc.net/problem/2660 1. **입력받기 및 초기화**:    - `n`: 회원.. 2024. 5. 21.
[C/C++] 백준 #2636 치즈(깊이우선탐색) 이번 문제는 그래프 탐색 문제인데, 너비우선탐색을 사용해도 되고 깊이우선탐색을 사용해도 됩니다.  제 경우에는 깊이우선탐색(Depth First Search)을 이용해서 풀었습니다.  https://www.acmicpc.net/problem/2636 문제에서 핵심은 공기가 있는 곳이라는 것을 확신할 수 있는 공간부터 시작을 하는 것입니다.  이 문제는 치즈의 공간에서 탐색을 하는 것이 아니고 공기 공간에서 탐색을 해서, 공기와 닿는 치즈를 다음번에 녹는다라고 표시하시면 됩니다. 제가 작성한 코드에서는 별도로 방문 표시를 배열을 잡아서 처리하지 않고, 그래프의 자료가 되는 맵에서 처리했습니다.  단지 탐색할 공간의 값을 매번 다르게 지정함으로써, 방문 배열을 초기화할 필요도 없고, 바로 처리할 수 있습니다.. 2024. 5. 14.
[C/C++] 백준 #2631 줄세우기(가장 긴 증가하는 부분수열) 이번 문제는 동적계획법을 이용해서 풀어도 되겠지만, 기본적으로 가장 긴 증가하는 부분수열(LIS; Longest Incremental Subsequence)의 풀이법을 이용하셔서 푸시는 것이 좋습니다.  일반적인 동적계획법으로 풀 경우에는 알고리즘 시간복잡도가 \(O(N^2)\)이지만, 가장 긴 증가하는 부분수열 풀이법을 이용하시면 \(O(N \log N)\) 시간복잡도로 풀 수 있습니다.  https://www.acmicpc.net/problem/2631 이 문제를 가장 긴 증가하는 부분수열 문제라는 것을 인지하는 것이 관건입니다.문제에서 예로 든 3 7 5 2 6 1 4 를 생각해보죠.  문제에서는 위치를 옮기는 4개의 숫자에 대해서 이야기를 했는데요.  쉽게 접근할 수 있는 방법은 이미 순서가 올바.. 2024. 5. 10.
[C/C++] 백준 #2630 색종이 만들기(분할정복) 이번 문제는 분할정복을 이용해서 풀면 어렵지 않게 풀 수 있습니다.  C/C++을 사용하다보면, 반환값을 여러개를 두고 싶은데, 그것이 어렵거나 할 때가 많죠.  색종이 만들기 문제에서는 흰종이와 파란종이를 나누어서 출력을 해주어야 하는데, 그것이 잘 안 되죠. https://www.acmicpc.net/problem/2630 반환값을 여러개가 안 되니까, 제 경우에는 65536(\(2^{16}\))의 값을 흰종이로 두고서 4바이트 정수 1개를 가지고 2바이트 정수 2개를 만들어서 사용했습니다. 분할정복한 결과가 4개의 구역이 모두 같은 색인 경우에는 1개의 종이로 대치하는 부분을 작성했습니다. int s = rec(r, c, v, n); s += rec(r+n, c, v, n); s +.. 2024. 5. 10.
[C/C++] 백준 #2624 동전 바꿔주기(동적계획법) 동전 바꿔주기 문제는 여러 종류의 동전을 가지고 원하는 액수의 금액을 맞추어주는 경우의 수 문제입니다.실생활에서는 크게 도움이 되지 않겠지만, 동적계획법을 이용한 알고리즘 문제로는 매우 유명합니다.  동적계획법을 사용할 때에는 보통 다차원 배열을 이용하게 되는데, 다차원 배열 대신에 맵(map) 또는 딕셔너리(dictionary) 자료를 이용해서도 문제를 풀 수 있습니다.  중간에 생기는 상태값의 갯수에 비해서 키(key)의 범위가 매우 큰 경우에는 다차원 배열보다는 맵 자료형을 사용하는 것이 좋습니다.  이것은 대략적인 감에 의존할 수밖에 없습니다.  다차원 배열이나 정렬되지 않은 맵(unordered map) 모두 \(O(1)\) 검색 알고리즘이지만, 정렬되지 않은 맵을 처리하기 위해서는 오버로드가 .. 2024. 5. 10.
728x90
반응형