[BOJ] 17144번 : 미세먼지 안녕!(Go, Golang)

김영한·2021년 3월 16일
0

알고리즘

목록 보기
25/74

문제 링크 : 백준 17144번

[문제 접근]

전형적인 구현 문제이다.
공기청정기 위쪽과 아래쪽 좌표를 저장해놓고 BFS탐색을 시작한다.
temp 배열에다 확산된 미세먼지들을 구하고 공기청정기 위쪽과 아래쪽 좌표를 통해 반시계방향과 시계방향으로 돌려준다.
돌려준 뒤에 arr배열에 완료된 temp배열을 대입해주고 공기청정기 좌표를 -1로 설정해준다.(temp 배열의 공기청정기 좌표값은 0으로 설정되어 있음)

[소스 코드]

package main

import (
	"bufio"
	"fmt"
	"os"
)

type pair struct {
	x, y int
}

var (
	read                        = bufio.NewReader(os.Stdin)
	write                       = bufio.NewWriter(os.Stdout)
	r, c, t, uax, uay, dax, day int
	arr                         [51][51]int
	dx                          = [4]int{0, 0, -1, 1}
	dy                          = [4]int{1, -1, 0, 0}
	unclock                     = [5][2]int{{0, 1}, {-1, 0}, {0, -1}, {1, 0}}
	clock                       = [5][2]int{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
)

func BFS() {
	var temp [51][51]int
	// 확산
	for i := 0; i < r; i++ {
		for j := 0; j < c; j++ {
			if arr[i][j] != 0 && arr[i][j] != -1 {
				x := i
				y := j
				num := arr[x][y] / 5
				cnt := 0
				for k := 0; k < 4; k++ {
					nx := x + dx[k]
					ny := y + dy[k]

					if nx < 0 || ny < 0 || nx >= r || ny >= c || arr[nx][ny] == -1 {
						continue
					}
					temp[nx][ny] += num
					cnt++
				}
				temp[x][y] += arr[x][y] - (num * cnt)
			}
		}
	}

	// 공기청정기 작동
	// 위쪽
	x := uax
	y := uay
	tmp := 0
	for i := 0; i < 4; i++ {
		for {
			nx := x + unclock[i][0]
			ny := y + unclock[i][1]

			if nx < 0 || ny < 0 || nx > uax || ny >= c {
				break
			}
			if arr[nx][ny] == -1 {
				break
			}

			swap := temp[nx][ny]
			temp[nx][ny] = tmp
			tmp = swap
			x = nx
			y = ny
		}
	}
	// 아래쪽
	x = dax
	y = day
	tmp = 0
	for i := 0; i < 4; i++ {
		for {
			nx := x + clock[i][0]
			ny := y + clock[i][1]

			if nx < dax || ny < 0 || nx >= r || ny >= c {
				break
			}
			if arr[nx][ny] == -1 {
				break
			}

			swap := temp[nx][ny]
			temp[nx][ny] = tmp
			tmp = swap
			x = nx
			y = ny
		}
	}
	arr = temp
	arr[uax][uay] = -1
	arr[dax][day] = -1
}

func main() {
	defer write.Flush()
	fmt.Fscan(read, &r, &c, &t)
	check := true
	for i := 0; i < r; i++ {
		for j := 0; j < c; j++ {
			fmt.Fscan(read, &arr[i][j])
			if arr[i][j] == -1 && check == false {
				dax = i
				day = j
			}
			if arr[i][j] == -1 && check {
				uax = i
				uay = j
				check = false
			}
		}
	}

	for t > 0 {
		t--
		BFS()
	}
	sum := 0
	for i := 0; i < r; i++ {
		for j := 0; j < c; j++ {
			sum += arr[i][j]
		}
	}
	fmt.Fprintln(write, sum+2)
}

0개의 댓글