-
Algorithm) BOJ) 백준 2667 - 단지번호붙이기Algorithm/BOJ 2019. 6. 6. 00:42728x90
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수
www.acmicpc.net
1. 초기접근
문제 조건 해석
전형적인 DFS 문제이다. (0,0) ~ (n, n) 까지 돌면서 방문하지 않은 곳은 단지를 이룬다.
알고리즘
(0,0) ~ (n,n) 까지 돌면서 아직 방문하지 않았고, 1인 곳에서 dfs 탐색을 시작한다.
이는 새로운 단지가 생겼음을 의미하므로 count를 0으로 초기화하고 dfs 탐색 후에 count값을 저장한다.
dfs 탐색에서는 현재 위치를 방문체크하고 map의 범위 안에서 동서남북을 탐색해나간다.
2. 회고
크게 어렵진 않았던 문제지만 입출력 받는 부분에 좀 더 익숙해져야 할 것 같고,
count = 0
dfs(i, j)
result.append(count)
의 로직을 생각하지 못해서 count != 0 일 때의 if 문을 추가해 비효율적인 코드로 작성했었다.
3. 코드
func solution() { guard let n = readLine().map({Int($0)!}) else {return} var map = [[Character]](repeating: [Character](), count: n) var visited = [[Bool]](repeating: [Bool](repeating: false, count: n), count: n) var count = 0 var result = [Int]() var nextRow = [-1, 0, 1, 0] var nextCol = [0, 1, 0, -1] for i in 0..<n { let inputs = readLine()! for s in inputs { map[i].append(s) } } func dfs(row currentRow: Int, col currentCol: Int) { if visited[currentRow][currentCol] { return } visited[currentRow][currentCol] = true if map[currentRow][currentCol] == "1" { count += 1 for i in 0..<4 { let nextR = currentRow + nextRow[i] let nextC = currentCol + nextCol[i] if nextR >= 0 && nextR < n && nextC >= 0 && nextC < n { dfs(row: nextR, col: nextC) } } } } for i in 0..<n { for j in 0..<n { if !visited[i][j] && map[i][j] == "1" { count = 0 dfs(row: i, col: j) result.append(count) } } } print(result.count) for i in result.sorted(by: <) { print(i) } } solution()
'Algorithm > BOJ' 카테고리의 다른 글
Algorithm) BOJ) 백준 2875 - 대회 or 인턴 (0) 2019.06.10 Algorithm) BOJ) 백준 7576 - 섬의 개수 (0) 2019.06.06 Algorithm) BOJ) 백준 9466 - 텀프로젝트 (0) 2019.06.04 Algorithm) BOJ) 백준 1406 - 에디터 (0) 2019.05.21 Algorithm) BOJ) 백준 1676 - 팩토리얼 0의 개수 (0) 2019.05.17