https://programmers.co.kr/learn/courses/30/lessons/1829
코딩테스트 연습 - 카카오프렌즈 컬러링북
6 4 [[1, 1, 1, 0], [1, 2, 2, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 3], [0, 0, 0, 3]] [4, 5]
programmers.co.kr
재귀함수를 사용한 DFS 알고리즘으로 구현
각 셀의 위 아래 오른쪽 왼쪽 4방향을 탐색하며 해당 셀이 현재 셀과 같은 색의 영역일 경우 다시 dfs에 돌입
하나의 영역을 탐색한 후 해당 영역의 셀의 개수를 반환하며 dfs 탈출
셀을 한칸한칸 탐색하며 탐색하지 않은 셀일 경우 다시 dfs를 불러 해당 영역을 모두 탐색
한 영역의 셀의 개수(cnt)들 중 가장 큰 값을 answer에 저장 (max함수)
풀이과정
1. main의 for문을 통해 모든 타일을 하나씩 탐색하며 dfs 함수 돌입
2. dfs 함수 내부에서 다시 for문을 통해 상, 하, 좌, 우 4개의 타일 탐색
3. 조건
인접 타일이 존재하면서 next_x >= 0 && next_y >= 0 && next_x < max_x && next_y < max_y
현재 타일과 인접 타일의 색상이 같고 pic[next_x][next_y]==pic[x][y]
그 인접 타일이 방문하지 않은 타일일 때 visit[next_x][next_y]!=1
카운트 (cnt) 증가 후 해당 타일의 좌표를 넣어 다시 dfs에 돌입
4. 하나의 섹션을 탐색하게 되면 섹션 크기의 최대값을 저장하는 변수 max_size_of_one_area 의 값과 비교하여
큰 값을 max_size_of_one_area 에 저장하고
총 섹션의 개수를 구하는 변수 number_of_area의 개수를 1 증가 후 dfs탈출
다시 main의 for문을 통해 다음 타일 탐색
----모든 타일 반복----
5. max_size_of_one_area, number_of_area 의 값을 결과로 리턴
vector<vector<int>> pic;
vector<vector<int>> visit;
vector<int> dx;
vector<int> dy;
int max_x;
int max_y;
int cnt;
int dfs(int x, int y) {
visit[x][y] = 1;
for (int i= 0; i < 4; i++) {
int next_x = x + dx[i];
int next_y = y + dy[i];
if (next_x >= 0 && next_y >= 0 && next_x < max_x && next_y < max_y && pic[next_x][next_y]==pic[x][y] && visit[next_x][next_y]!=1) {
cnt++;
dfs(next_x, next_y);
}
}
return cnt;
}
vector<int> solution(int m, int n, vector<vector<int>> picture) {
int number_of_area = 0;
int max_size_of_one_area = 0;
vector<int> answer(2);
answer[0] = number_of_area;
answer[1] = max_size_of_one_area;
pic = picture;
dx = { 0, 1, 0, -1};
dy = { 1, 0, -1, 0 };
max_x = m;
max_y = n;
vector<vector<int>> v(m, vector<int>(n, 0));
visit = v;
for (int i = 0; i < pic.size();i++) {
for (int j = 0; j < pic[0].size(); j++) {
if (visit[i][j] == 0 && pic[i][j]!=0) {
cnt = 1;
max_size_of_one_area = max(dfs(i, j), max_size_of_one_area);
number_of_area++;
}
}
}
answer[0] = number_of_area;
answer[1] = max_size_of_one_area;
return answer;
}
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[프로그래머스] N으로 표현 C++ (DP) (0) | 2022.05.05 |
---|---|
[프로그래머스] 타겟넘버 C++ (dfs) (0) | 2022.05.05 |
[프로그래머스] 크레인 인형뽑기 게임 C++ (stack) (0) | 2022.05.03 |
[프로그래머스] 키패드 누르기 C++ (0) | 2022.05.03 |
[프로그래머스] 숫자 문자열과 영단어 C++ (0) | 2022.05.02 |