백준_적록색약_swift_드디어dfs성공

hankyulee·2021년 10월 7일
0

Swift coding test 준비

목록 보기
18/57


어려워하던 dfs 를 맞았다..!


import Foundation

var N = Int(readLine()!)!
var line = [String]()
var graph:[[String]] = Array(repeating: [], count: N)
var visit = Array(repeating: Array(repeating: false, count: N), count: N)
var abnormalVisit = Array(repeating: Array(repeating: false, count: N), count: N)
for row in 0..<N {
    line = readLine()!.map{String($0)}
    graph[row] = line
}
print(graph)
func dfs(x:Int,y:Int,color:String){
    visit[x][y] = true
    if x < N - 1 && graph[x+1][y] == color {
        if visit[x+1][y] == false{
            dfs(x: x+1, y: y, color: color)
        }
    }
    if x > 0 && graph[x-1][y] == color {
        if visit[x-1][y] == false{
            dfs(x: x-1, y: y, color: color)
        }
    }
    if y < N - 1 && graph[x][y+1] == color {
        if visit[x][y+1] == false{
            dfs(x: x, y: y+1, color: color)
        }
    }
    if y > 0 && graph[x][y-1] == color {
        if visit[x][y-1] == false{
            dfs(x: x, y: y-1, color: color)
        }
    }
    
}
//
func abnormalDfs(x:Int,y:Int,color:String){
    abnormalVisit[x][y] = true
    if (graph[x][y] == "R" || graph[x][y] == "G")  {
        if x < N - 1 && graph[x+1][y] != "B" {
            if abnormalVisit[x+1][y] == false{
                abnormalDfs(x: x+1, y: y, color: color)
            }
        }
        if x > 0 && graph[x-1][y] != "B" {
            if abnormalVisit[x-1][y] == false{
                abnormalDfs(x: x-1, y: y, color: color)
            }
        }
        if y < N - 1 && graph[x][y+1] != "B" {
            if abnormalVisit[x][y+1] == false{
                abnormalDfs(x: x, y: y+1, color: color)
            }
        }
        if y > 0 && graph[x][y-1] != "B" {
            if abnormalVisit[x][y-1] == false{
                abnormalDfs(x: x, y: y-1, color: color)
            }
        }
        
    }
    else if graph[x][y] == "B" {
        if x < N - 1 && graph[x+1][y] == color {
            if abnormalVisit[x+1][y] == false{
                abnormalDfs(x: x+1, y: y, color: color)
            }
        }
        if x > 0 && graph[x-1][y] == color {
            if abnormalVisit[x-1][y] == false{
                abnormalDfs(x: x-1, y: y, color: color)
            }
        }
        if y < N - 1 && graph[x][y+1] == color {
            if abnormalVisit[x][y+1] == false{
                abnormalDfs(x: x, y: y+1, color: color)
            }
        }
        if y > 0 && graph[x][y-1] == color {
            if abnormalVisit[x][y-1] == false{
                abnormalDfs(x: x, y: y-1, color: color)
            }
        }
    }
    
    
    
}
var normal = 0
var abnormal = 0

for x in 0..<N{
    for y in 0..<N{
        if visit[x][y] == false{
            var color = graph[x][y]
            dfs(x:x,y:y,color:color)
            normal += 1
        }
        
    }
}
for x in 0..<N{
    for y in 0..<N{
        if abnormalVisit[x][y] == false{
            var color = graph[x][y]
            abnormalDfs(x:x,y:y,color:color)
            abnormal += 1
        }
        
    }
}
print(normal,abnormal,terminator: " ")


  • 정상인 파트와 적록색약 파트를 나누어서 계산했다.
  • visit 부분을 먼저 작성하니까 편하다.

깨달은것.

  • 타입명시 안하면 배열은 any가 된다

0개의 댓글