[Algorithm] 백준 - 2667번 단지번호 붙이기 (Swift)

2024. 5. 12. 13:57· → Problems
목차
  1. 문제 소개
  2. 문제 풀이
  3. DFS 풀이
  4. BFS 풀이
  5. 결과

문제 소개

https://www.acmicpc.net/problem/2667

DFS, BFS 로 모두 풀 수 있는 문제여서 두가지 방법을 사용해 보았다.
 

문제 풀이

DFS 풀이

우선 dfs를 활용한 풀이는 재귀함수를 사용했다.

import Foundation

let n = Int(readLine()!)!
var visit = Array(repeating: Array(repeating: false, count: n), count: n)
var graph = [[Int]]()

for _ in 0..<n {
    let input = Array(readLine()!).map { Int(String($0))! }
    graph.append(input)
}

var total = 0
var counts = [Int]()

for i in 0..<n {
    for j in 0..<n {
        if !visit[i][j] && graph[i][j] == 1 {
            total += 1
            var count = 1
            visit[i][j] = true
            
            func dfs(_ i: Int, _ j: Int) {
                let directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
                
                for direction in directions {
                    let i = i + direction.0
                    let j = j + direction.1
                    
                    if i >= 0 && i < n && j >= 0 && j < n {
                        if !visit[i][j] && graph[i][j] == 1 {
                            visit[i][j] = true
                            count += 1
                            dfs(i, j)
                        }
                    }
                }
            }
            
            dfs(i, j)
            counts.append(count)
        }
    }
}

print(total)
for count in counts.sorted() {
    print(count)
}

BFS 풀이

큐를 사용하여 문제를 풀었다.

import Foundation

let n = Int(readLine()!)!
var visit = Array(repeating: Array(repeating: false, count: n), count: n)
var graph = [[Int]]()

for _ in 0..<n {
    let input = Array(readLine()!).map { Int(String($0))! }
    graph.append(input)
}

var total = 0
var counts = [Int]()

for i in 0..<n {
    for j in 0..<n {
        if !visit[i][j] && graph[i][j] == 1 {
            var count = 1
            total += 1
            visit[i][j] = true
            
            let directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
            var queue = [(i, j)]
            
            while !queue.isEmpty {
                let poped = queue.removeFirst()
                
                for direction in directions {
                    let i = poped.0 + direction.0
                    let j = poped.1 + direction.1
                    
                    if i >= 0 && i < n && j >= 0 && j < n {
                        if !visit[i][j] && graph[i][j] == 1 {
                            visit[i][j] = true
                            count += 1
                            queue.append((i, j))
                        }
                    }
                }
            }
            
            counts.append(count)
        }
    }
}

print(total)
for count in counts.sorted() {
    print(count)
}

 

결과

N이 25이하이기 때문에 두 풀이에 큰 차이는 없어보인다.

'→ Problems' 카테고리의 다른 글

[Algorithm] 백준 - 7576번 토마토 (Swift)  (0) 2024.05.13
[Algorithm] 백준 - 2178번 미로 탐색 (Swift)  (0) 2024.05.13
[Algorithm] 백준 - 11724번 연결 요소의 개수 (Swift)  (0) 2024.05.12
[Algorithm] 백준 - 1260번 DFS와 BFS (Swift)  (0) 2024.05.10
[Algorithm] 백준 - 13023번 ABCDE (Swift)  (0) 2024.05.10
  1. 문제 소개
  2. 문제 풀이
  3. DFS 풀이
  4. BFS 풀이
  5. 결과
'→ Problems' 카테고리의 다른 글
  • [Algorithm] 백준 - 7576번 토마토 (Swift)
  • [Algorithm] 백준 - 2178번 미로 탐색 (Swift)
  • [Algorithm] 백준 - 11724번 연결 요소의 개수 (Swift)
  • [Algorithm] 백준 - 1260번 DFS와 BFS (Swift)
Swift librarian
Swift librarian
Swift librarian
Swift Library
Swift librarian
전체
오늘
어제
  • 분류 전체보기 (231)
    • 📺 Programming (5)
    • → Architecture (2)
    • → Design Pattern (0)
    • → Computer Science (15)
    • ⚙️ Algorithm (0)
    • → 알고리즘 관련 (22)
    • → Problems (104)
    • 🚀 Project (0)
    • → 알쏭달쏭 (0)
    • → Shook (2)
    • → Solver (8)
    • → Taster (7)
    • → Outline (4)
    • → Pointer (2)
    • → Guesser (3)
    • 🦜 Swift (2)
    • → Swift Archive (12)
    • → Swift Study (12)
    • → Xcode (6)
    • 🧰 Framework (0)
    • → Foundation (1)
    • → UIKit (2)
    • → SwiftUI (3)
    • → CoreData (2)
    • → MapKit (1)
    • → CoreHaptic (1)
    • → User Notification (1)
    • → StoreKit (2)
    • 🏛️ Library (0)
    • → TCA (0)
    • 🐈‍⬛ Git (8)
    • → Git의 원리 (2)
    • → Git 심화 (1)
    • 📦 Other (1)
    • 👦🏻 Log (0)

최근 글

hELLO · Designed By 정상우.v4.2.2
Swift librarian
[Algorithm] 백준 - 2667번 단지번호 붙이기 (Swift)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.