티스토리 뷰
백준 16956, 늑대와 양 문제 개요, 애드혹(ad-hoc)이란?
오늘은 백준 16956, 늑대왕 양 문제를 풀어보겠습니다. 해당 문제는 애드혹 문제로, 애드혹이란 특정 접근방법 없이 창의적 아이디어를 활용해서 풀 수 있는 문제라고 합니다. 실버3 티어의 문제로, 늑대에게 양이 잡아먹히지 않도록 울타리를 놓을 수 있다면 1과 그래프 상태를, 늑대에게 잡하먹힐 수밖에 없다면 0을 출력하는 문제입니다.
해당 문제의 중요한 점은 울타리를 놓는데 제한이 없다는 것입니다. 몇개의 울타릴 놓던간에, 양이 먹히지만 않으면 됩니다. 그렇게 제가 생각한 것은 "모든 양과 늑대가 처음에 붙어있지만 않는다면 무조건 양이 울타리를 놓아 살 수 있다" 입니다. 그리고, "양이 살기 위해 최대한 자신의 주변의 빈공간에 울타리를 놓으면 살 수 있다." 입니다. 이를 swift코드로 구현해보겠습니다.
백준 16956, 늑대와 양 문제 swift 풀이
평소에 커스텀으로 만들어 쓰던 클로져를 그대로 사용했습니다. 입력량이 적은 문제라 그냥 split이나 components 활용하셔도 문제 없습니다. R, C로 행과 열을 입력받고, G 그래프를 그려주었습니다.
입력받은 그래프를 다시 순회합니다. "S" 양일 경우에 대해서만 체크합니다. 양일 경우 인접한 늑대가 존재한다면 양은 먹힐수밖에 없으므로 즉시, 0을 출력합니다. 만약 인접공간에 자리가 비면, 울타리를 무조건 설치해서 양이 늑대에게 먹히지 않도록 해줍니다. 그렇게 모든 순회를 거쳤을때 양이 늑대와 인접하는 경우가 없다면, 양은 무조건 살 수 있습니다. 당당하게 1을 반환해줍니다.
양이 살수 없으면 0을 출력, 양이 살 수 있으면 울타리르 놓았던 그래프 G를 주어진 포맷에 맞게 출력해줍니다. 저는 reduce와 joined를 활용해서 [[Character]] 타입의 그래프, G를 주어진 포맷에 맞게 String 타입으로 변화해서 출력해주었습니다.
이렇게 간단하게 늑대와 양 에드혹(ad-hoc) 알고리즘 문제를 풀어보았습니다. swift언어 풀이 제출 결과는 아래와 같습니다. 이만 포스팅 마치겠습니다. 즐거운 코딩 되세요.
백준 16956, 늑대와 양 swift언어 제출 결과
백준 16956, 늑대와 양 swift언어 전체 소스코드
let readInput: (() -> [Int]) = {
var result: [Int] = []
var temp = 0
readLine()!.forEach { char in
if char == " " {
result.append(temp)
temp = 0
return
}
temp = temp * 10 + Int(char.asciiValue!) - 48
}
result.append(temp)
return result
}
let ip = readInput()
let (R, C) = (ip[0], ip[1])
var G: [[Character]] = []
(0..<R).forEach { _ in
G.append(Array(readLine()!))
}
let dx = [0, 0, -1, 1]
let dy = [1, -1, 0, 0]
func canSaveSheeps() -> Int {
for idx in G.indices {
for jdx in G[idx].indices {
if G[idx][jdx] != "S" { continue }
for ddx in dx.indices {
let nx = idx + dx[ddx]
let ny = jdx + dy[ddx]
if nx < 0 || ny < 0 || nx >= R || ny >= C || G[nx][ny] == "S" { continue }
if G[nx][ny] == "W" { return 0 }
G[nx][ny] = "D"
}
}
}
return 1
}
if canSaveSheeps() == 0 {
print(0)
} else {
print(G.reduce(into: ["1"]) { rowList, row in
rowList.append(row.map { "\($0)" }.joined())
}.joined(separator: "\n"))
}
'알고리즘 정보 > Swift 알고리즘' 카테고리의 다른 글
백준 1799, 비숍 백트래킹 backtracking 스위프트 문제풀이 (0) | 2021.12.21 |
---|---|
종만북 비트마스크 연산자 기본예제, swift언어로 보기 (0) | 2021.11.21 |
백준 17471, 게리맨더링 조합, 완전탐색 swift 문제풀이 (0) | 2021.10.02 |
백준 1043 거짓말, 유니온파인드 swift언어 문제풀이 (0) | 2021.09.22 |
코딜리티 Codility easy문제, permCheck swift 풀이 (0) | 2021.08.04 |
- Total
- Today
- Yesterday
- swift문제
- 부스트코스
- 자연어처리
- ios
- 백준알고리즘
- Swift 알고리즘
- 알고리즘
- 김프매매
- 알고리즘문제
- swift언어
- 스위프트
- 백준swift
- 프로그래머스
- publisher
- swift reduce
- createML
- swift string
- Protocol
- swift 문자열
- swift 기초
- swift알고리즘
- swift
- SwiftUI
- uikit
- 프로토콜
- CoreML
- 개발자문서
- 프로그래머스swift
- Collection
- 컬렉션
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |