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
- softeer
- NRVO
- baekjoon
- GeeksForGeeks
- 프로그래머스
- winapi
- UnrealEngine4
- 팰린드롬 만들기
- RVO
- 언리얼엔진5
- 1563
- algorithm
- DirectX11
- const
- C
- 백준
- C++
- UnrealEngine5
- 2294
- Frustum
- Programmers
- UE5
- 줄 세우기
- Unreal Engine5
- 티스토리챌린지
- RootMotion
- IFileDialog
- 오블완
- DeferredRendering
- directx
Archives
- Today
- Total
Game Develop
[Algorithm] Programmers :: 카카오프렌즈 컬러링북 본문
https://school.programmers.co.kr/learn/courses/30/lessons/1829
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
|
int Row;
int Column;
bool Visited[101][101];
vector<pair<int, int>> Direction;
struct Node
{
int row;
int column;
Node(int _row, int _column) : row(_row), column(_column) {};
};
int BFS(int startRow, int startColumn, vector<vector<int>>& picture) // 영역크기 리턴.
{
queue<Node> q;
int count = 0;
Visited[startRow][startColumn] = true;
int standColor = picture[startRow][startColumn];
q.push(Node(startRow, startColumn));
while (!q.empty())
{
Node popedNode = q.front();
q.pop();
count++;
int curRow = popedNode.row;
int curColumn = popedNode.column;
for (int i = 0; i < Direction.size(); i++)
{
int nextRow = curRow + Direction[i].first;
int nextColumn = curColumn + Direction[i].second;
if (nextRow < 0 || nextRow > Row - 1) continue;
if (nextColumn < 0 || nextColumn > Column - 1) continue;
if (!Visited[nextRow][nextColumn] && picture[nextRow][nextColumn] == standColor)
{
Visited[nextRow][nextColumn] = true;
q.push(Node(nextRow, nextColumn));
}
}
}
return count;
}
vector<int> solution(int m, int n, vector<vector<int>> picture) {
vector<int> answer;
Row = m;
Column = n;
fill(&Visited[0][0],&Visited[m][n], false);
Direction = { make_pair(-1,0),make_pair(1,0),make_pair(0,-1),make_pair(0,1) };
int areaCount = 0;
int areaMaxSize = 0;
for (int i = 0; i < Row; i++)
{
for (int j = 0; j < Column; j++)
{
if (!Visited[i][j] && picture[i][j] != 0)
{
areaCount++;
int areaSize = BFS(i,j,picture);
if (areaSize > areaMaxSize) areaMaxSize = areaSize;
}
}
}
answer.push_back(areaCount);
answer.push_back(areaMaxSize);
return answer;
}
|
cs |
BFS푸는 감?을 잃지 않기위해 풀어본 문제다. 각 연결된 영역들의 개수와 영역의 최대크기를 구하는 문제다.
방문하지 않은 노드에 대해서만 0,0부터 시작해서 m,n까지 BFS를 진행한다.
어차피 방문하지않은것만 하기 때문에 시간복잡도에 걸릴일은 없다.
BFS에서는 인풋으로 들어온 좌표부터 시작해서 상하좌우를 탐색하며 standColor값이 같은것만 큐에 넣는다.
picture에서 0은 색깔이 칠해지지 않은것을 의미하기떄문에 0은 무시한다.
'Algorithm > Programmers' 카테고리의 다른 글
[Algorithm] Programmers :: 퍼즐 조각 채우기 (0) | 2022.07.31 |
---|---|
[Algorithm] Programmers :: 추석트래픽 (0) | 2022.07.16 |
[Algorithm] Programmers :: 오픈채팅방 (0) | 2022.07.15 |
[Algorithm] Programmers :: 문자열 압축 (0) | 2022.07.14 |
[Algorithm] Programmers :: 로또의 최고순위와 최저순위 (0) | 2022.07.13 |