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
- Frustum
- UnrealEngine4
- baekjoon
- 줄 세우기
- 1563
- C++
- winapi
- 언리얼엔진5
- algorithm
- RVO
- 팰린드롬 만들기
- 프로그래머스
- softeer
- Programmers
- 2294
- RootMotion
- directx
- const
- 오블완
- UnrealEngine5
- 티스토리챌린지
- DirectX11
- 백준
- Unreal Engine5
- UE5
- C
- IFileDialog
- DeferredRendering
- NRVO
- GeeksForGeeks
Archives
- Today
- Total
Game Develop
[Algorithm] Programmers :: 석유 시추 본문
https://school.programmers.co.kr/learn/courses/30/lessons/250136
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
#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 dirs[4][2] = { {-1,0}, {1,0}, {0,-1}, {0,1} };
int oilMapIndex = 25001;
int oilSizes[60005] = { 0 };
struct Node
{
int y;
int x;
};
void UpdateOilMap(int startY, int startX, vector<vector<int>>& land)
{
vector<Node> nodes = { {startY,startX} };
queue<Node> q;
int height = land.size();
int width = land[0].size();
q.push({ startY,startX });
++land[startY][startX];
while (!q.empty())
{
int curY = q.front().y;
int curX = q.front().x;
q.pop();
for (int i = 0; i < 4; ++i)
{
int nextY = curY + dirs[i][0];
int nextX = curX + dirs[i][1];
if (nextY < 0 || nextY == height) continue;
if (nextX < 0 || nextX == width) continue;
if (land[nextY][nextX] != 1) continue;
++land[nextY][nextX];
nodes.push_back({ nextY, nextX });
q.push({ nextY,nextX });
}
}
int count = nodes.size();
for (int i = 0; i < nodes.size(); ++i)
{
land[nodes[i].y][nodes[i].x] = oilMapIndex;
oilSizes[oilMapIndex] = count;
}
++oilMapIndex;
}
int solution(vector<vector<int>> land)
{
int answer = 0;
int height = land.size();
int width = land[0].size();
for (int i = 0; i < height; ++i)
{
for (int j = 0; j < width; ++j)
{
if (land[i][j] == 1)
{
UpdateOilMap(i, j, land);
}
}
}
for (int i = 0; i < width; ++i)
{
int count = 0;
vector<bool> check(60005, false);
for (int j = 0; j < height; ++j)
{
int index = land[j][i];
if (check[index]) continue;
else
{
check[index] = true;
count += oilSizes[index];
}
}
answer = max(answer, count);
}
return answer;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//vector<vector<int>> land =
//{
// {0, 0, 0, 1, 1, 1, 0, 0} ,
// {0, 0, 0, 0, 1, 1, 0, 0},
// {1, 1, 0, 0, 0, 1, 1, 0},
// {1, 1, 1, 0, 0, 0, 0, 0},
// {1, 1, 1, 0, 0, 0, 1, 1}
//}; //// 9
/*vector<vector<int>> land =
{
{1, 0, 1, 0, 1, 1},
{1, 0, 1, 0, 0, 0},
{1, 0, 1, 0, 0, 1},
{1, 0, 0, 1, 0, 0},
{1, 0, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 1}
};*/ //// 16
//vector<vector<int>> land =
//{
// {1, 1, 1, 1},
// {1, 0, 0, 0},
// {1, 0, 1, 0},
// {1, 0, 0, 0},
// {1, 1, 1, 1},
//}; //// 12
cout << solution(land);
}
|
cs |
각 열에 시추관을 뚫었을 때 얻을 수 있는 기름칸의 최대개수를 구하는 문제이다.
나는 아래순서로 풀었다.
1. UpdateOilMap
-> BFS를 이용해 덩어리크기를 구하고, land에 해당차례의 OilMapIndex로 덩어리들좌표에 전부 심어준다.
UpdateOilMap을 마칠때마다 OilMapIndex를 ++해준다.
즉 우리는 각 덩어리들을 인덱스로 관리한다.
2. 각 열마다 행을 순회한다. (시추관을 뚫는다)
해당 칸이 0이 아닌 경우, 해당 칸의 index를 이전에 방문했는지 검사한다. (97번째 라인)
검사 안한 index일 경우, 해당인덱스의 덩어리크기를 해당열의 count에 누적시킨다.
모든 행을 순회했을 경우, answer에 최대값업데이트를 한다.
실수가 많이 날 수 있는 테스트케이스로는139번째 라인의 테스트케이스가 있으니 참고하길 바람.
'Algorithm > Programmers' 카테고리의 다른 글
[Algorithm] Programmers :: 충돌위험 찾기 (1) | 2024.10.18 |
---|---|
[Algorithm] Programmers :: 미로 탈출 명령어 (1) | 2024.06.03 |
[Algorithm] Programmers :: 도넛과 막대그래프 (1) | 2024.01.11 |
[Algorithm] Programmers :: 상담원 인원 (0) | 2023.09.04 |
[Algorithm] Programmers :: 연속 펄스 부분 수열의 합 (0) | 2023.09.04 |