-
LeetCord - 733. Flood Fill제로부터 C# 코딩테스트 2024. 1. 10. 20:13728x90
이미지는 m x n 크기의 정수 그리드인 image로 표현됩니다.
image[i][j]는 이미지의 픽셀 값입니다.
또한 세 개의 정수 sr, sc, color가 제공됩니다. 이미지[sr][sc]에서 시작하여 이미지에 대해 flood fill 작업을 수행해야 합니다.
flood fill을 수행하기 위해서는 시작 픽셀과 동일한 색상을 가진 시작 픽셀과 4방향으로 연결된 모든 픽셀, 그리고 그 픽셀들과 4방향으로 연결된 모든 픽셀들(또한 같은 색상)을 고려합니다. 이들 모든 픽셀의 색상을 color로 바꿉니다.
flood fill을 수행한 후 수정된 이미지를 반환합니다.
1. BFS 탐색 준비하기
- 상하좌우 이동방향이 들어있는 배열을 만듭니다.
- 방문처리할 image의 크기만큼 bool 배열을 만듭니다.
- 시작지점을 미리 방문 처리하고 시작위치의 색을 바꿔줍니다.
- 다음 이동위치를 저장할 큐를 만듭니다.
- 시작위치를 큐에 넣습니다.
2. 탐색 시작
- 탐색 종료 조건은 더이상 이동할 위치가 없는 경우 입니다.
- 큐에 넣어놓은 위치를 가져와 이동할 위치값을 구하고 image 배열 안에 있으면서 방문하지 않았고 본래 색과 똑같다면 다음 방문위치의 색을 바꿔준뒤 방문처릴해주고 큐에 넣어줍니다.
public class Solution { public int[][] FloodFill(int[][] image, int sr, int sc, int color) { int originColor = image[sr][sc]; int imageRow = image.Length; int imageCol = image[0].Length; int[,] move = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; bool[,] visited = new bool[imageRow, imageCol]; visited[sr, sc] = true; image[sr][sc] = color; Queue<Coord> coords = new Queue<Coord>(); coords.Enqueue(new Coord(sr, sc)); while (coords.Count > 0) { Coord coord = coords.Dequeue(); for (int i = 0; i < 4; i++) { int nx = coord.X + move[i, 0]; int ny = coord.Y + move[i, 1]; if (nx >= 0 && ny >= 0 && nx < imageRow && ny < imageCol && image[nx][ny] == originColor && !visited[nx, ny]) { image[nx][ny] = color; visited[nx, ny] = true; coords.Enqueue(new Coord(nx, ny)); } } } return image; } struct Coord { public int X; public int Y; public Coord(int _x, int _y) { X = _x; Y = _y; } } }
728x90'제로부터 C# 코딩테스트' 카테고리의 다른 글
LeetCord - 300.Longest Increasing Subsequence (0) 2024.01.11 LeetCord - 84. Largest Rectangle in Histogram (0) 2024.01.09 프로그래머스 - 신고 결과 받기 (0) 2023.12.16 프로그래머스 소수 만들기 (0) 2023.11.29 프로그래머스 - 정수를 나선형으로 배치하기 (1) 2023.11.22