Algorithm/Baekjoon
[Swift] 백준 1012 유기농 배추 코드 및 해설
내일은개발천재🎵
2022. 4. 3. 22:40
문제 사이트
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
생각 과정
- BFS 풀자→ 파이썬처럼 튜플 자체를 넣는게 잘 안 됐음.. (방법을 내가 모르는 듯)
→ 2차원리스트의 위치를 큐에 삽입하기 어려웠음. - DFS로 풀자
→ 좌표 생각하는게 어려웠지만, 성공
알고리즘
- Test Case만큼 반복문 수행
- 그래프, 좌표 정보 입력받아 저장
> 함수에 매개변수 직접 쓰지 않기 위해 전역변수로 선언했음. - 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
📍 좌표 계산을 잘 하자... 제발