티스토리 뷰
최근에 알고리즘 문제를 너무 안풀어서 오랜만에 실버문제 하나를 풀고 포스팅을 해봅니다.
백준 13565번 문제, 침투를 풀어보겠습니다.
백준 13565, 침투 문제 설명
M x N 크기의 격자가 있을때, 1행의 흰색 영역에서 시작해서 맨 마지막 행의 흰색 영역에 도달할 수 있는지를 체크하면 되는 단순한 그래프 유형 문제입니다. 격자에 "1"이 표시되면 검은영역, "0"이 표시되면 흰영역(침투 가능한 영역)을 의미합니다. 그럼 바로 swift 언어로 문제를 풀어보겠습니다.
백준 13565, 침투 문제 swift 풀이
상, 하, 좌, 우 좌표를 정의한 dx, dy 상수배열을 먼저 선언했습니다. 이후 R, C(행, 열) 상수를 입력받았습니다. G는 격자 정보를 담을 이차원 배열입니다. visit은 현재 격자의 방문여부를 판단할 이차원 배열입니다.
격자의 1행 위치를 돌면서, 흰 영역일 경우, 위의 DFS 메서드를 돌릴겁니다. 4방향에 대하여, 격자 밖을 벗어나는지, 검은 영역인지, 이미 방문한 영역인지 체크하고, 방문하지 않았다면 DFS로 탐색을 시작합니다.
만약 탐색하는 곳이 R-1, 행의 끝에 도달하는 경우, true를 반환합니다. 행의 끝에 도달할 수 있는 경우의 수가 1가지라도 존재한다면, 침투가 가능함을 의미하기 때문입니다.
0번째 행(배열은 zero based index이므로, 첫번째 행이 0으로 시작)의 격자를 탐색합니다. 만약 아직 방문하지 않았고 + 흰 영역, "0"인 경우에는 방문체크를 하고(29행) 해당 0행 idx열부터 시작하여 맨 마지막 행 위치까지 침투 가능한지 체크를 하기 위해 DFS를 돌립니다.
이렇게 모든 경우의 수를 돌리면서 DFS 메서드가 true를 반환하는 경우가 한번이라도 있다면 ans는 true값을 갖게 됩니다. 마지막 33행에서는 침투 가능여부를 담고 있는 ans 변수를 출력하고 있습니다.
지금까지 기본 그래프문제인 백준 13565, 침투문제를 풀어봤습니다. 질문이나 의견 댓글 환영합니다. 전체소스코드 아래 첨부드리겠습니다. 즐거운 하루되세요.
let dx = [0, 0, -1, 1]
let dy = [-1, 1, 0, 0]
let ip = readLine()!.split(separator: " ").map { Int(String($0))! }
let (R, C) = (ip[0], ip[1])
var G = [[Character]]()
var visit = [[Bool]](repeating: [Bool](repeating: false, count: C), count: R)
(0..<R).forEach { _ in
G.append(Array(readLine()!))
}
func DFS(_ x: Int, _ y: Int) -> Bool {
for idx in dx.indices {
let nx = x + dx[idx]
let ny = y + dy[idx]
if nx < 0 || ny < 0 || nx >= R || ny >= C { continue }
if visit[nx][ny] || G[nx][ny] == "1" { continue }
visit[nx][ny] = true
if nx == R-1 { return true }
if DFS(nx, ny) { return true }
}
return false
}
var ans = false
for idx in G[0].indices {
if G[0][idx] == "1" || visit[0][idx] { continue }
visit[0][idx] = true
if DFS(0, idx) { ans = true; break }
}
print(ans ? "YES" : "NO")
'알고리즘 정보 > Swift 알고리즘' 카테고리의 다른 글
프로그래머스 2단계, 무인도 여행 DFS 알고리즘 문제 풀이 (0) | 2023.02.02 |
---|---|
프로그래머스 2단계 연습문제, 롤케이크 자르기 swift 풀이 (0) | 2023.02.01 |
백준 2331, 반복수열 swift dictionary, 거듭제곱 풀이 (0) | 2021.12.25 |
백준 1799, 비숍 백트래킹 backtracking 스위프트 문제풀이 (0) | 2021.12.21 |
종만북 비트마스크 연산자 기본예제, swift언어로 보기 (0) | 2021.11.21 |
- Total
- Today
- Yesterday
- swift 기초
- createML
- Protocol
- 컬렉션
- 자연어처리
- swift언어
- 부스트코스
- swift 문자열
- 프로토콜
- 김프매매
- 개발자문서
- swift알고리즘
- 프로그래머스
- Collection
- 스위프트
- swift
- swift string
- 알고리즘문제
- 백준swift
- swift문제
- swift reduce
- 알고리즘
- 프로그래머스swift
- 백준알고리즘
- CoreML
- SwiftUI
- publisher
- uikit
- Swift 알고리즘
- ios
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |