Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- IFileDialog
- const
- Programmers
- RootMotion
- softeer
- winapi
- 언리얼엔진5
- 줄 세우기
- 1563
- 프로그래머스
- DirectX11
- UE5
- 2294
- UnrealEngine5
- C
- UnrealEngine4
- DeferredRendering
- 티스토리챌린지
- 백준
- NRVO
- directx
- 팰린드롬 만들기
- C++
- baekjoon
- Unreal Engine5
- Frustum
- RVO
- algorithm
- GeeksForGeeks
- 오블완
Archives
- Today
- Total
Game Develop
[Algorithm]Baekjoon 2637번 : 장난감 조립 본문
https://www.acmicpc.net/problem/2637
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
#include <functional>
#include <sstream>
#include <memory.h>
#include <deque>
#include <set>
#include <unordered_map>
#include <stack>
#include <numeric>
using namespace std;
int n, m;
bool visited[101] = { false };
vector<vector<pair<int, int>>> graph(101);
vector<unordered_map<int, int>> primaryPartsInfo(101);
void DFS(int curPartsNum)
{
for (int i = 0; i < graph[curPartsNum].size(); ++i)
{
int nextNode = graph[curPartsNum][i].first;
int count = graph[curPartsNum][i].second;
if (graph[nextNode].size() == 0) // 기본부품이면
{
primaryPartsInfo[curPartsNum][nextNode] += count;
continue;
}
if (!visited[nextNode])
{
visited[nextNode] = true;
DFS(nextNode);
}
for (auto iter = primaryPartsInfo[nextNode].begin(); iter != primaryPartsInfo[nextNode].end(); iter++)
{
int primaryPartsNum = iter->first;
int primaryPartsCount = iter->second;
primaryPartsInfo[curPartsNum][primaryPartsNum] += primaryPartsCount * count;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 0; i < m; ++i)
{
int x, y, k;
cin >> x >> y >> k;
graph[x].push_back({ y,k });
}
visited[n] = true;
DFS(n);
vector<pair<int, int>> answer;
for (auto iter = primaryPartsInfo[n].begin(); iter != primaryPartsInfo[n].end(); iter++)
{
answer.push_back({ iter->first, iter->second });
}
sort(answer.begin(), answer.end());
for (int i = 0; i < answer.size(); ++i)
{
printf("%d %d\n", answer[i].first, answer[i].second);
}
}
|
cs |
골드2짜리긴한데 생각보다 어렵지 않은 문제다.
각 부품관계가 얽혀있는데, 최종 완제품을 만들었을 때 기본부품의 개수를 구하는 문제이다.
중간부품을 구성하는 기본부품의 개수를 구하는부분이 중복되기 때문에 해당부분만 처리해주면 되는 문제이다.
나같은경우, vector<unordered_map<int,int>> 라는 컨테이너를 따로 만들어서, iterator를 통해 특정부품의 기본부품들의 개수를 바로 알 수 있게 사용해봤다.
맵을사용안하면 최대 n개의 배열탐색을 해야하는데, n값이 최대 100밖에 안되기때문에 배열을 사용하더라도 통과가 되긴했을것이다.
dfs로 자식노드들을 탐색시도할건데, 이전에 구해놨던 값이면 해당 자식노드를 구성하는 기본부품의 개수를 전부 자신한테 업데이트 한다.
구해놨던게 아니면 방문표시하고 DFS를 호출해서 값을 구해놓은다음, 자신한테 업데이트하면 된다.
'Algorithm > Baekjoon' 카테고리의 다른 글
[Algorithm]Baekjoon 10835번 : 카드게임 (1) | 2024.04.16 |
---|---|
[Algorithm]Baekjoon 1793번 : 타일링 (0) | 2024.04.11 |
[Algorithm]Baekjoon 11062번 : 카드 게임 (0) | 2024.04.09 |
[Algorithm]Baekjoon 2213번 : 트리의 독립집합 (0) | 2024.04.03 |
[Algorithm]Baekjoon 11058번 :: 크리보드 (0) | 2024.03.31 |