본문 바로가기

알고리즘10

[priority queue] 우선순위 큐 구조체 오름차순 정렬, custom sort priority queue의 custom sort를 찾아보게된 이유는 다익스트라 알고리즘 때문이다. 하얀색 박스를 보면 (-) 부호를 붙이는 모습을 볼 수 있다. 이는 구현의 편의를 위해 priority_queue를 사용하는데, 알고리즘 흐름상 우리는 오름차순으로 값을 얻기를 원하지만, priority queue는 자동으로 내림차순으로 출력되기 때문에(큰 값이 앞에 오기 때문에) 부호를 바꾸어가며 사용하는 것이다. 이를 보며 sort() 함수에서 세 번째 인자로 custom compare 함수를 만들어 사용하듯 priority queue도 custom sort가 가능하지 않을까 하여 찾아보았다. 결론부터 말하자면 찾아본 방법 중 여러 방법이 있지만, 그 중 두 가지 정도 방법을 사용할 것 같다. 사용자가.. 2021. 9. 29.
[백준 BOJ] 1074 : Z (C++) https://www.acmicpc.net/problem/1074 1074번: Z 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, N > 1이 라서 www.acmicpc.net 어떻게 보면 그냥 구현이라고 볼 수 있을 것 같은데, 그래도 이 문제 같이 재귀가 핵심 아이디어인 문제들은 조금 다른 느낌이 있어서 재귀 카테고리로 따로 모은다 #include using namespace std; int func(int n, int r, int c) { // base condition if (n == 0) return 0; // 0, 1, 2, 3 section 중 어디에.. 2021. 8. 16.
[백준 BOJ] 4963 : 섬의 개수 (C++) https://www.acmicpc.net/problem/4963 4963번: 섬의 개수 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도 www.acmicpc.net 아이디어 흐름 1. 아이디어 구상 1. 해당 위치에서 주변으로 뻗어나가는 탐색이 필요 => DFS, BFS 모두 가능할 것 같다. 2. 가로, 세로, 대각선 모두 연결을 확인해야 하므로 탐색은 dx = { 1, 1, 0, -1, -1, -1, 0, 1 } dy = { 0, 1, 1, 1, 0, -1, -1, -1 } dx[i], dy[i] 인덱스를 이동시키는 방식으로 상하좌우 대각선 탐색 (.. 2021. 8. 14.
[백준 BOJ] 1260 : DFS와 BFS(C++) https://www.acmicpc.net/problem/1260 1260번: DFS와 BFS 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사 www.acmicpc.net #include #include #include #include using namespace std; bool visited[1001]; vector graph[1001]; // 1. 방문처리 // 2. 현재 노드 출력 // 3. 현재 노드의 인접 노드 개수만큼 반복문 실행 // 4. 반복문에 의한 인접 노드가 방문되지 않았다면 dfs 재귀호출 void dfs.. 2021. 8. 10.
[백준 BOJ] 6588 : 골드바흐의 추측(C++) https://www.acmicpc.net/problem/6588 6588번: 골드바흐의 추측 각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰 www.acmicpc.net 아이디어 흐름 1. 아이디어 구상 소수에 대한 문제가 크게 특정 범위 안의 소수를 알아야하는 경우, 해당 수가 소수인지 판별하는 경우 이렇게 두 가지가 있다고 생각하는데, 해당 문제는 1,000,000 까지의 소수를 알아야했으므로 에라토스테네스의 체를 이용하기로 했다. 또한 그렇게 소수를 판별하고, 소수만을 따로 모은 prime_arr 를 만들어서 int tmp = num .. 2021. 8. 5.
[백준 BOJ] 2579 : 계단 오르기 (C++) https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net 아이디어 흐름 1. 아이디어 구상 이전에 풀었던 dp문제들에 견주어 이 문제 또한 '내가 i번째에 있을 때 이것을 선택할때, 하지 않을 때' 라는 측면에서 먼저 생각해보았다. 세 가지를 연속으로 선택할 수 없다는 조건을 생각해보고 dp[i] = dp[i - 3] + max((arr[i - 2] + arr[i - 1]), (arr[i - 2] + arr[i]), (arr[i - 1] + arr[i])) 위와 같.. 2021. 7. 28.