일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 파이썬
- 재귀
- 시간복잡도
- PHP
- OSI
- ftz level13
- windosws wbcs
- 두근두근 자료구조
- ftz
- System
- 큐
- level13
- HTML
- 스택
- web
- c언어
- Stack
- War Game
- LoB
- windosw 문자열
- 암호수학
- 미로 탐색 알고리즘
- 정렬 알고리즘
- Java
- SWiFT
- C
- pwnable.kr
- 파일 시스템
- 자료구조
- 백준
Archives
- Today
- Total
나의 기록, 현진록
[Swift] 백준 토마토 7569 본문
반응형
https://www.acmicpc.net/problem/7569
1. 문제이해
- M: 상자의 가로, N: 상자의 세로, H: 상자 갯수
- 3차원 배열 형태의 토마토 상자
- 익은 토마토 주변에 있는 토마토는 하루가 지나면 익은 토마토가 된다.
- 주변의 범위는 토마토의 앞, 뒤, 좌, 우 그리고 위에 있는 상자와 아래에 있는 상자에 대한 토마토 총 6방향
- 모든 토마토가 익기 위해서 며칠 걸리는지 구하기
2. 접근방법
- 일반적인 BFS에서 윗 상자와 아랫 상자에 있는 토마토의 경우가 추가 됨
- 예시)
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 → 0 0 1 0 0
0 0 1 0 0 0 1 1 1 0
토마토는 3차원 배열이지만 2차원 배열 만들어서 코드 작성해보기
3. 코드
import Foundation
func solution(){
var input = readLine()!.split(separator: " ").map{Int(String($0))!}
let M = input[0] // 가로
let N = input[1] // 세로
let H = input[2] // 상자 갯수
var map = [[Int]]()
let dx = [1,0,0,-1]
let dy = [0,1,-1,0]
var count = 0 // 모든 토마토가 익기까지 걸리는 날짜
var queue = [(Int, Int)]()
for _ in 0..<N*H{
map.append(readLine()!.split(separator: " ").map{Int(String($0))!})
}
for i in 0..<map.count{
for j in 0..<map[i].count{
if map[i][j] == 1{
queue.append((i,j))
}
}
}
// BFS
while !queue.isEmpty{
var newQueue = [(Int, Int)]()
for q in queue{
for index in 0..<dx.count{
let nx = q.0 + dx[index]
let ny = q.1 + dy[index]
var a = q.0 / N + 1
if nx >= N * a - N && nx < N * a && ny >= 0 && ny < M && map[nx][ny] == 0{
map[nx][ny] = 1
newQueue.append((nx,ny))
}
}
// 윗 상자와 아랫 상자에 대한 경우
let up = q.0 - N
let down = q.0 + N
if up >= 0 && map[up][q.1] == 0{
map[up][q.1] = 1
newQueue.append((up, q.1))
}
if down < N*H && map[down][q.1] == 0{
map[down][q.1] = 1
newQueue.append((down, q.1))
}
}
if newQueue.isEmpty{
break
}
queue = newQueue
count += 1
}
var complete = true
for i in 0..<map.count{
for j in 0..<map[i].count{
if map[i][j] == 0{
complete = false
}
}
}
print(complete ? count : -1)
}
solution()
반응형
'Programming > Algorithm & Data Structure' 카테고리의 다른 글
[Swift] 백준 2116 주사위 쌓기 (0) | 2024.12.03 |
---|---|
[Swift] 백준 17182 우주 탐사선 (0) | 2024.11.26 |
[Swift] 프로그래머스 입국심사 (2) | 2024.11.13 |
[Swift] 백준 게임 1072 (0) | 2024.11.12 |
[Swift] 프로그래머스 코딩테스트 연습 > 연습문제 > 인사고과 (0) | 2023.05.03 |