요구능력 : DFS응용
코드설명 :
문제를 보면 똑같은걸 연속해서 찾는것(?) 이므로 깊이우선탐색으로 풀리는 문제이다.
이 문제에서의 핵심
1) 각각의 점이 들어있는 칸이 변을 공유한다.(상하좌우로 이동가능하다.)
2) dk와 d1이 인접해야한다.
d1은 맨 처음에 방문하는 점인데 결국, dk까지 방문해서가면 d1은 이미 방문처리 되어있지만 dk에서 이동가능한 점이라서 맨 마지막에 확인이 가능하다.
1. 변수선언 및 입력
좀 복잡하게 입력받은거 같은데 입력받은줄을 for문을 이용해 캐릭터배열로 넣어서 2차원 캐릭터배열로 옮긴것이다.
let nm = readLine()!.split(separator: " ").map{Int(String($0))!}
let n = nm[0]
let m = nm[1]
var arr = [[Character]]()
let dx = [0,0,-1,1]
let dy = [1,-1,0,0]
var result = false
var visited = Array(repeating: Array(repeating: false, count: 51), count: 51)
for _ in 0..<n{
let a = readLine()!
var char = [Character]()
for i in a {
char.append(i)
}
arr.append(char)
}
2. 이중 for문으로 2차원 배열의 모든점을 한번씩 시작지점으로 둘러본다.
for i in 0..<n{
for j in 0..<m{
if !visited[i][j]{
dfs(i, j, 1, i, j)
}
}
}
3. dfs로 탐색한다.
시작지점은 방문처리를 해준다.
그리고 4방향으로 갈 수 있는곳인지 없는곳인지 따져서 갈 수있다면 dfs()로 계속해서 탐색해준다.
startX와 startY같은 경우에는 시작지점을 계속해서 저장해주는데 나중에 나올 dk에서 이동가능한점이 시작지점이고 4보다 크거나같을경우 사이클이 완성되기 때문이다.
func dfs(_ x: Int, _ y: Int, _ depth: Int, _ startX: Int, _ startY: Int){
visited[x][y] = true
for i in 0..<4{
let nx = x + dx[i]
let ny = y + dy[i]
if nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && arr[nx][ny] == arr[x][y]{
dfs(nx, ny, depth + 1, startX, startY)
}
if nx == startX && ny == startY && depth >= 4{
result = true
return
}
}
visited[x][y] = false
}
후기 : 처음에 보면 어려워보이는데 막상 문제에서 요구하는 사항만 파악하면 잘풀리는문제
let nm = readLine()!.split(separator: " ").map{Int(String($0))!}
let n = nm[0]
let m = nm[1]
var arr = [[Character]]()
let dx = [0,0,-1,1]
let dy = [1,-1,0,0]
var result = false
var visited = Array(repeating: Array(repeating: false, count: 51), count: 51)
for _ in 0..<n{
let a = readLine()!
var char = [Character]()
for i in a {
char.append(i)
}
arr.append(char)
}
for i in 0..<n{
for j in 0..<m{
if !visited[i][j]{
dfs(i, j, 1, i, j)
}
}
}
if result{
print("Yes")
}else {
print("No")
}
func dfs(_ x: Int, _ y: Int, _ depth: Int, _ startX: Int, _ startY: Int){
visited[x][y] = true
for i in 0..<4{
let nx = x + dx[i]
let ny = y + dy[i]
if nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && arr[nx][ny] == arr[x][y]{
dfs(nx, ny, depth + 1, startX, startY)
}
if nx == startX && ny == startY && depth >= 4{
result = true
return
}
}
visited[x][y] = false
}
'Algorithm > 문제풀이_백준' 카테고리의 다른 글
[Swift][BFS] 백준 14442번 (벽 부수고 이동하기 2) - 시간초과 (0) | 2022.01.10 |
---|---|
[Swift][BFS] 백준 2206번 (벽 부수고 이동하기) (0) | 2022.01.03 |
[Swift][DP] 백준 12865 (평범한 배낭) (0) | 2021.12.28 |
[Swift][BruteForce] 백준 2003번 (수들의 합 2) (0) | 2021.12.28 |
[Swift][BruteForce] 백준 15658번 (연산자 끼워넣기 (2)) (0) | 2021.12.27 |
댓글