728x90
https://www.acmicpc.net/problem/1245
1. BFS
산봉우리들을 세는 문제이다. 좌표는 상하좌우 + 대각선, 총 8방향으로 인접한 칸이면 이동할 수 있으며, 높이 값이 0 이면 산봉우리가 아니다 !!! 따라서 bfs 탐색 또한 높이가 0 보다 클 때만 처리했다.
bfs에서 , 현재 확인중인 array[x][y] 값을 중심으로, 자기자신 보다 높은 위치를 만나면 (x, y) 에 해당하는 봉우리 라인은 산봉우리가 될 수 없다.
if matrix[nx][ny] > matrix[x][y] { // 현재 탐색중인 값이 산봉우리가 아님
flag = false
}
따라서 산봉우리 여부를 판단하는 변수인 flag에 false 값을 저장한다.
if matrix[nx][ny] == matrix[x][y] && !visited[nx][ny] { // 같은 높이의 산봉우리 탐색
visited[nx][ny] = true
queue.append([nx, ny])
}
그리고 내가 bfs를 통해 하려는 작업은, 높이가 같으며 이어져있는 칸들을 방문하는 것이다.
현재 높이보다 낮은 경우는 산봉우리를 찾는데 필요하지 않은 작업이므로, 이에 대해서 방문 여부를 처리하지 않았다.
값을 처리하는 것은 여러 방법이 있겠지만, swift 특성상 전역변수 answer 를 하나 설정하고 산봉우리이면 그 값을 더해주는 방식으로 구했다. bfs 내의 파라미터로 넣으면 함수의 파라미터는 변수가 아닌 상수이므로 값을 바꿀수가 없다
import Foundation
let input = readLine()!.split { $0 == " "}.map{ Int(String($0))! }
let n = input[0]
let m = input[1]
var answer = 0
// reapting: 초기값, count: 배열의 크기
var matrix = Array(repeating: Array(repeating: 0, count: m), count: n)
for i in 0..<n {
let data = readLine()!.split(separator: " ").map{ Int(String($0))! }
matrix[i] = data
}
var visited = Array(repeating: Array(repeating: false, count: m), count: n)
// 8방향 탐색
let dx = [-1, 1, 0, 0, -1, 1, -1, 1]
let dy = [0, 0, -1, 1, -1, 1, 1, -1]
for i in 0..<n {
for j in 0..<m {
if matrix[i][j] > 0 && visited[i][j] == false {
bfs(a: i, b: j)
}
}
}
func bfs(a:Int, b:Int) {
answer += 1
var flag = true
var queue: [[Int]] = []
queue.append([a, b])
visited[a][b] = true
while !queue.isEmpty {
let d = queue.removeFirst()
let x = d[0]
let y = d[1]
for i in 0..<8 {
var nx = 0
var ny = 0
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx && nx < n && 0 <= ny && ny < m { // 범위 내에 있는지 확인
if matrix[nx][ny] > matrix[x][y] { // 현재 탐색중인 값이 산봉우리가 아님
flag = false
}
if matrix[nx][ny] == matrix[x][y] && !visited[nx][ny] { // 같은 높이의 산봉우리 탐색
visited[nx][ny] = true
queue.append([nx, ny])
}
}
}
}
// while 문 통과
if flag == false {
answer -= 1
}
}
print(answer)
2. DFS
주요 로직은 동일하므로 설명은 생략하고 dfs로 푼 전체 코드이다.
import Foundation
let input = readLine()!.split { $0 == " "}.map{ Int(String($0))! }
let n = input[0]
let m = input[1]
var answer = 0
var matrix = Array(repeating: Array(repeating: 0, count: m), count: n)
for i in 0..<n {
let data = readLine()!.split(separator: " ").map{ Int(String($0))! }
matrix[i] = data
}
var visited = Array(repeating: Array(repeating: false, count: m), count: n)
// 8방향 탐색
let dx = [-1, 1, 0, 0, -1, 1, -1, 1]
let dy = [0, 0, -1, 1, -1, 1, 1, -1]
var flag = true
for i in 0..<n {
for j in 0..<m {
if matrix[i][j] > 0 && visited[i][j] == false {
// bfs(a: i, b: j)
flag = true // reset flag to default
dfs(x:i, y:j)
if flag {
answer += 1
}
}
}
}
func dfs(x:Int, y:Int) {
visited[x][y] = true
for i in 0..<8 {
let nx = x + dx[i]
let ny = y + dy[i]
if 0 <= nx && nx < n && 0 <= ny && ny < m {
if matrix[nx][ny] > matrix[x][y] {
flag = false
}
if matrix[nx][ny] == matrix[x][y] && visited[nx][ny] == false {
dfs(x: nx, y: ny)
}
}
}
}
print(answer)
728x90
'Algorithm (PS)' 카테고리의 다른 글
[백준] 12933번 : 오리 Swift 풀이 - 구현 (0) | 2022.12.16 |
---|---|
[프로그래머스] 행렬의 곱셈 Swift - 구현/선형대수학 (0) | 2022.12.14 |
[백준] 10836번: 여왕벌 (파이썬/Python) - 시뮬레이션/구현/Greedy (0) | 2022.12.12 |
[백준] 14567번: 선수과목 (Python/파이썬) - 위상정렬 (0) | 2022.12.11 |
[백준] 13913번 : 숨바꼭질 4 (파이썬/Python) - BFS 풀이 (0) | 2022.12.10 |