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
- 1563
- winapi
- const
- 줄 세우기
- Unreal Engine5
- C
- UnrealEngine4
- baekjoon
- 백준
- Frustum
- UnrealEngine5
- RVO
- 프로그래머스
- 오블완
- Programmers
- UE5
- DirectX11
- 티스토리챌린지
- GeeksForGeeks
- IFileDialog
- softeer
- algorithm
- 2294
- 팰린드롬 만들기
- NRVO
- DeferredRendering
- directx
- RootMotion
- 언리얼엔진5
- C++
Archives
- Today
- Total
Game Develop
[Algorithm] Programmers :: 광물 캐기 본문
https://school.programmers.co.kr/learn/courses/30/lessons/172927
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#define MAX_NUM 1000000
struct Node
{
int index;
int weightSum;
int size;
int pick = MAX_NUM;
};
bool weightSumDecreaseSort(const Node& a, const Node& b)
{
return a.weightSum > b.weightSum;
}
bool indexIncreaseSort(const Node& a, const Node& b)
{
return a.index < b.index;
}
int solution(vector<int> picks, vector<string> minerals)
{
int answer = 0;
vector<Node> nodes;
vector<int> tempPicks;
int weights[3][3] = { {1,1,1}, {5,1,1}, {25,5,1} };
for (int i = 0; i < 3; ++i)
{
int standard = picks[i];
for (int j = 0; j < standard; ++j)
{
tempPicks.push_back(i);
}
}
int mineralsSize = 0;
int count = 0;
if (tempPicks.size() >= ceil(minerals.size() / 5.0)) // 모든 광석 다 캘 수 있으면
{
count = minerals.size() / 5;
mineralsSize = minerals.size();
}
else // 곡괭이가 부족해서 전부 못캐면, 범위내의 미네랄로만 가중치계산해야됨..
{
count = tempPicks.size();
mineralsSize = count * 5;
}
int index = 0;
while (1)
{
if (count > 0)
{
int weight = 0;
for (int i = index; i < index + 5; ++i)
{
if (minerals[i] == "diamond") weight += 25;
if (minerals[i] == "iron") weight += 5;
if (minerals[i] == "stone") weight += 1;
}
nodes.push_back({ index,weight,5 });
index += 5;
--count;
}
else break;
}
if (mineralsSize % 5 != 0)
{
int weight = 0;
for (int i = index; i < mineralsSize; ++i)
{
if (minerals[i] == "diamond") weight += 25;
if (minerals[i] == "iron") weight += 5;
if (minerals[i] == "stone") weight += 1;
}
nodes.push_back({ index,weight,mineralsSize - index });
}
sort(nodes.begin(), nodes.end(), weightSumDecreaseSort);
for (int i = 0; i < tempPicks.size(); ++i)
{
if (i >= nodes.size()) // 곡괭이가 더 많을경우
{
break;
}
else
{
nodes[i].pick = tempPicks[i];
}
}
sort(nodes.begin(), nodes.end(), indexIncreaseSort);
for (int i = 0; i < nodes.size(); ++i)
{
if (nodes[i].pick == MAX_NUM) break;
int curPick = nodes[i].pick;
for (int j = nodes[i].index; j < nodes[i].index + nodes[i].size; ++j)
{
if (minerals[j] == "diamond") answer += weights[curPick][0];
if (minerals[j] == "iron") answer += weights[curPick][1];
if (minerals[j] == "stone") answer += weights[curPick][2];
}
}
return answer;
}
|
cs |
n값이 작아서 완전탐색으로도 충분히 풀 수 있는 문제이긴 하지만, 만약 n값이 크게 나온다면..?
그래서 완전탐색 아닌 방식으로 푸는쪽으로 생각해봤다.
큰 틀은 광석을 5개씩 나눠서 가중치를 계산해서 정렬해서 어떤 곡괭이를 쓸지 계산하는 것이다.
즉, 0번째 인덱스부터 4번째 인덱스까지의 5개의 광석의 가중치값(피로도값)이 가장 크다면, 거기는 다이아곡괭이로 작업을 하는게 가장 적은 피로도를 소모할 것이다.
이렇게 최대 5개씩 나눠서 node로 보관한다. node에는 시작index(index), 광석갯수(size), 가중치합(weightSum), 곡괭이타입(pick) 의 멤버변수가 있다.
즉, 시작인덱스에서 시작인덱스 + size 까지의 가중치합을 구한다음, node를 가중치합을 기준으로 정렬을 시키고 가중치합이 큰 순서대로 node의 pick에다가 가장 좋은 곡괭이를 하나씩 넣는 방식이다.
그다음 다시 index기준으로 오름차순정렬을 해준다음 앞에서부터 pick에 담겨있는 곡괭이로 피로도를 계산해주면 된다.
주의할 점은, 광석을 캐는데 필요한 곡괭이가 부족할 수도 있다는 것이다.
즉 광석은 총 13개인데 곡괭이를 1개만 줄 수도 있다. 그리고 그 반대일 수도 있고.
이 점을 명심해서 코드를 작성하면 된다.
'Algorithm > Programmers' 카테고리의 다른 글
[Algorithm] Programmers :: N-Queen (0) | 2023.05.26 |
---|---|
[Algorithm] Programmers :: 모음사전 (0) | 2023.05.26 |
[Algorithm] Programmers :: 요격 시스템 (0) | 2023.05.24 |
[Algorithm] Programmers :: 멀리 뛰기 (0) | 2023.05.21 |
[Algorithm] Programmers :: 땅따먹기 (1) | 2023.05.21 |