chevron_right 목차
문제
solved.ac Silver 2, Class 3
접근
2차원 공간에서 만날 수 있는 사람의 수를 세는 문제로, 전형적인 그래프 탐색 문제이다. 여기서는 구현이 간단한 DFS로 풀어보도록 하자.
풀이
package main
import (
"bufio"
"fmt"
"os"
)
var arr [][]rune
var isVisited [][]bool
var result int = 0
var n int
var m int
func dfs(x, y int) {
if isVisited[x][y] {
return
}
isVisited[x][y] = true
if arr[x][y] == 'P' {
result++
}
next := [4][2]int{
{x + 1, y},
{x - 1, y},
{x, y + 1},
{x, y - 1},
}
for _, i := range next {
if 0 <= i[0] && i[0] < n && 0 <= i[1] && i[1] < m && !isVisited[i[0]][i[1]] && arr[i[0]][i[1]] != 'X' {
dfs(i[0], i[1])
}
}
}
func main() {
inp := bufio.NewReader(os.Stdin)
_, _ = fmt.Fscanf(inp, "%d %d\n", &n, &m)
arr = make([][]rune, n)
isVisited = make([][]bool, n)
var startX int
var startY int
for i := range n {
arr[i] = make([]rune, m)
isVisited[i] = make([]bool, m)
for j := range m {
_, _ = fmt.Fscanf(inp, "%c", &arr[i][j])
if arr[i][j] == 'I' {
startX = i
startY = j
}
isVisited[i][j] = false
}
_, _ = fmt.Fscanf(inp, "\n")
}
dfs(startX, startY)
if result == 0 {
fmt.Printf("TT\n")
} else {
fmt.Printf("%d\n", result)
}
}기타
Kotlin으로 풀었을 때, 재귀로 구현하거나 filter를 여러 번 사용했을 경우 시간 초과가 발생했다.
chevron_left
이전 글 [알고리즘] BOJ 1931: 회의실 배정article
현재 글 [알고리즘] BOJ 21736: 헌내기는 친구가 필요해인용하기
BibTeX
@misc{devngho202520251214boj21736,
author = {Yu, Dongho},
title = {BOJ 21736: 헌내기는 친구가 필요해},
howpublished = {\url{https://ngho.dev/posts/20251214boj21736}},
year = {2025},
month = {dec},
note = {Accessed: 2025-12-14}
}APA 유동호. (2025년 12월 14일). BOJ 21736: 헌내기는 친구가 필요해. devngho 블로그. https://ngho.dev/posts/20251214boj21736
Chicago 유동호. “BOJ 21736: 헌내기는 친구가 필요해.” devngho 블로그 (blog). 2025년 12월 14일. https://ngho.dev/posts/20251214boj21736.
MLA 유동호. “BOJ 21736: 헌내기는 친구가 필요해.” devngho 블로그, 2025년 12월 14일, https://ngho.dev/posts/20251214boj21736.