Algorithm/Baekjoon

[Swift] 백준 1012 유기농 배추 코드 및 해설

내일은개발천재🎵 2022. 4. 3. 22:40

 문제 사이트 

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net


 생각 과정 

  1. BFS 풀자→ 파이썬처럼 튜플 자체를 넣는게 잘 안 됐음.. (방법을 내가 모르는 듯)
    → 2차원리스트의 위치를 큐에 삽입하기 어려웠음.
  2. DFS로 풀자
    → 좌표 생각하는게 어려웠지만, 성공

 알고리즘 

  1. Test Case만큼 반복문 수행
  2. 그래프, 좌표 정보 입력받아 저장
    > 함수에 매개변수 직접 쓰지 않기 위해 전역변수로 선언했음.
  3. dfs를 호출하여 true를 반환한 경우만 result에 합산
    > 그래프로 연결되어있는 경우, 최초 1개의 노드에서만 true를 반환하도록 했음.
    > 따라서 Main.swift:32:9: warning: result of call to 'dfs(x:y:)' is unused 이런 경고가 나타남

 나의 코드 

let T: Int = Int(readLine()!)!
var graph:[[Int]] = [[Int]]() // 배추 농장 지도
var info: [Int] = [Int]() // m, n, k

for _ in 1...T{ // test case만큼 반복

    var result: Int = 0 // 정답을 담을 변수
    info = readLine()!.split(separator: " ").map{ Int(String($0))! }
    
    // 배추농장지도 초기화 방법
    let a = [Int].init(repeating: 0, count: info[0]) //가로길이만큼 0으로 초기화
    graph = [[Int]].init(repeating: a, count: info[1]) //a를 세로길이만큼 반복
    
    for _ in 0..<info[2]{ // 배추가 존재하는 위치
        let lo: [Int] = readLine()!.split(separator: " ").map{ Int($0)! }
        graph[lo[1]][lo[0]] = 1
    }
    
    // x = info[1], n / y = info[0], m
    for x in 0..<info[1]{
        for y in 0..<info[0]{
            if dfs(x: x, y: y){
                result += 1
            }
        }
    }
    print(result)
}

func dfs(x: Int, y: Int) -> Bool{
    if (x <= -1 || x >= info[1] || y <= -1 || y >= info[0]){
        return false
    }
    if graph[x][y] == 1{
        graph[x][y] = 0
        dfs(x: x-1, y: y) // 만약 여기서 true반환해도, 사용되지 않음.
        dfs(x: x+1, y: y)
        dfs(x: x, y: y-1)
        dfs(x: x, y: y+1)
        return true // 최초 한 번만 true를 반환
    }
    return false
}

 Key Point 

📍 좌표 계산을 잘 하자... 제발