개발하자 중엽아
  • [백준/BOJ] 10026번 적록색약 (Swift 스위프트)
    2024년 08월 08일 14시 24분 40초에 업로드 된 글입니다.
    작성자: 이중엽

    문제 난이도: 골드 5

     

    사용 알고리즘: DFS

     

    처음 제시한 맵과 적록색약 맵 두 개를 만들었다.

     

    각 맵은 아래와 같이 만들어진다.

     

    map =

    [["R", "R", "R", "B", "B"],

    ["G", "G", "B", "B", "B"],

    ["B", "B", "B", "R", "R"],

    ["B", "B", "R", "R", "R"],

    ["R", "R", "R", "R", "R"]]

     

    rgMap =

    [["G", "G", "G", "B", "B"],

    ["G", "G", "B", "B", "B"],

    ["B", "B", "B", "G", "G"],

    ["B", "B", "G", "G", "G"],

    ["G", "G", "G", "G", "G"]]

     

    dfs를 통해 일치하는 색상만 탐색하여 dfs를 돌린 횟수를 기록하였다.

     

    import Foundation
    
    let input = Int(readLine()!)!
    var map: [[String]] = Array<[String]>()
    var rgMap: [[String]] = Array<[String]>()
    var visited: [[Bool]] = Array(repeating: Array(repeating: false, count: input), count: input)
    
    var directions = [(0, -1), (0, 1), (-1, 0), (1, 0)]
    
    var result = 0
    var rgResult = 0
    
    for _ in 0 ..< input {
        
        let data = readLine()!.map { String($0) }
        let rgData = data.map { datum -> String in
            
            if datum == "R" {
                return "G"
            }
            
            return datum
        }
        
        map.append(data)
        rgMap.append(rgData)
    }
    
    func dfs(x: Int, y: Int, color: String, map: [[String]]) {
        
        if x < 0 || x >= input || y < 0 || y >= input || map[y][x] != color || visited[y][x] {
            return
        }
        
        visited[y][x] = true
        
        for direction in directions {
            
            let newX = x + direction.0
            let newY = y + direction.1
            
            dfs(x: newX, y: newY, color: color, map: map)
        }
    }
    
    for y in 0 ..< input {
        for x in 0 ..< input {
            
            if !visited[y][x] {
                result += 1
                let color = map[y][x]
                dfs(x: x, y: y, color: color, map: map)
            }
        }
    }
    
    print(result)
    
    visited = Array(repeating: Array(repeating: false, count: input), count: input)
    
    for y in 0 ..< input {
        for x in 0 ..< input {
            
            if !visited[y][x] {
                rgResult += 1
                let color = rgMap[y][x]
                dfs(x: x, y: y, color: color, map: rgMap)
            }
        }
    }
    
    print(rgResult)

     

    다른 사람 풀이를 봤더니, 편하게 data에서 replacingOccurrences라는 메서드로 "R"을 "G"로 바꾸고 있었다...

    있는지도 몰랐는데, 하나 배웠다.

     

    여기서 단순하게 color만 일치하지 않으면 패스해버리기 때문에, 굳이 visited를 안 쓰고 방문한 곳의 값을 바꿔주기만 했어도 됐다.

    댓글