※ 이 글은 그래프 탐색을 이해했다는 것을 전제 하에 쓰였습니다.
이 문제는 DFS(깊이우선탐색)을 연습하는게 딱 좋은 맵이라고 생각한다. 영어라고 겁먹을 필요없다.
우리에게는 파파고라는 좋은 친구가 있으니까
우리 파파고가 말해준 문제를 약간 요약했을때 이 문제는 저 사진에 나와있는 피라미드로 되어있는 숫자들이 보일것이다. 그래서 맨위의 숫자부터 밑으로 한층씩 내려오는데 이때 자신의 위치에서 바로 왼쪽, 오른쪽 밖에 갈 수가 없다. 그렇게 끝까지 내려왔을때의 합이 가장 큰 경우에서 그 합을 출력하면 되는것이다.
입력으로는 첫번째로 몇층으로 할건지 받고
그이후 피라미드가 만들어졌을때의 갯수 만큼의 숫자를 입력받는다.
출력은 가장 큰 합을 출력한다.
예시로
저 원을 노드라하고 빨간선을 간선이라고 했을때 맨 위에 있는 노드로 부터 시작해서 점점 탐색을 하는데 만약 탐색을 하던 도중 노드에서 외부 노드로 향하는 간선의 갯수가 0일때를 가장 피라미드의 밑부분까지 왔다고 판단하여 지금까지 지나온 경로를 합으로 더하는 방식으로 코드를 짰다.
#include <iostream>
#include <vector>
using namespace std;
int Num = 0;
int* answer;
int Real_answer = 0;
int N;
typedef struct Node {
int score = 0;
vector<int> adj;
} Node;
vector<Node> x;
int real_box = 0;
void DFS(int num, int a) {
answer[a] = x[num].score;
if (x[num].adj.size() == 0) {
for (int i = 0; i < N; i++) {
real_box += answer[i];
}
if (Real_answer < real_box) {
Real_answer = real_box;
}
real_box = 0;
return;
}
for (int i = 0; i < x[num].adj.size(); i++) {
DFS(x[num].adj[i], a + 1);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N;
answer = new int[N];
for (int i = N; i >= 1; i--) {
Num = Num + i;
}
for (int i = 0; i < N; i++) {
answer[i] = 0;
}
x.resize(Num);
int as = 1;
int ad = 0;
for (int i = 0; i < Num; i++) {
if (ad == as) {
ad = 0;
as++;
}
cin >> x[i].score;
if (as < N) {
x[i].adj.push_back(i + as);
x[i].adj.push_back(i + as + 1);
}
ad++;
}
DFS(0, 0);
cout << Real_answer;
return 0;
}
이 코드는 처음 짰을 당시 보여주기 용으로 짠 코드가 아니기에 보기에 다소 불편한 구조들이 많다. ex) 변수명
DFS 기초 문제이기 때문에 방식만 안다면 쉬울 것 이므로 코드를 보기보다는 방식만 알아둬도 푸는데 지장이 없다.
'알고리즘' 카테고리의 다른 글
유전 알고리즘(Genetic Algorithm) - 스스로 길을 찾는 AI를 만들어보았다 (1) | 2023.02.27 |
---|---|
알고리즘 핵심 강의 (이론) 1일차 (0) | 2022.01.10 |
2021년 06월 05일 입력버퍼 비우기 (0) | 2021.06.05 |