[Python] 백준/BOJ 21736번: 헌내기는 친구가 필요해 (Silver 2)

2025. 2. 7. 11:00·Algorithm/백준 (BOJ)

💻 Problem

문제 보러 가기

 

도연이가 다니는 대학의 캠퍼스는 N×M 크기이며 캠퍼스에서 이동하는 방법은 벽이 아닌 상하좌우로 이동하는 것이다. 도연이가 이동할 수 있는 곳은 상하좌우이다. 단, 캠퍼스의 밖으로 이동할 수는 없다.

불쌍한 도연이를 위하여 캠퍼스에서 도연이가 만날 수 있는 사람의 수를 출력하는 프로그램을 작성해 보자.

O는 빈 공간, X는 벽, I는 도연이, P는 사람이다.

 

💡 Approach

먼저 도연이의 위치를 찾고 시작점으로 잡아 bfs를 돌린다.

4방향을 탐색할 때, 범위를 벗어나지 않고 벽이 아니면 이동할 수 있다.

이때, 탐색하려는 칸이 사람이면 cnt에 1을 더한다.

출력할 때는 삼항연산자를 써도 되지만, or를 쓰면 cnt가 0일 때 'TT'를 출력했다.

 

✏️ Solution

import sys
from collections import deque
input = sys.stdin.readline

def bfs(x, y):
    dx = (-1, 1, 0, 0)
    dy = (0, 0, -1, 1)
    
    queue = deque([(x, y)])
    visited[x][y] = True
    cnt = 0 # 만난 사람 수

    while queue:
        x, y = queue.popleft()

        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]

            # 다음 칸이 이동 가능한 칸이면 이동한다
            if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and campus[nx][ny] != 'X':
                # 만약 다음 칸이 사람이면 만난 사람 수가 증가한다   
                if campus[nx][ny] == 'P':
                    cnt += 1
                # 이어서 탐색한다
                visited[nx][ny] = True
                queue.append((nx, ny))
    
    print(cnt or 'TT')

n, m = map(int, input().split())
campus = [input() for _ in range(n)]
visited = [[False] * m for _ in range(n)]

for i in range(n):
    for j in range(m):
        if campus[i][j]  == 'I':
            bfs(i, j)
            exit(0)

bfs를 탐색하는 시간복잡도는 O(V + E)이다.

여기서 간선의 개수는 4방향을 탐색하니 4V이고 더하면 총 5V가 된다.

정점의 개수는 n * m이므로 5V는 5 * n * m이다.

n, m은 총 600이므로 대입하면 18 * 10 ^ 5이다.

반응형

'Algorithm > 백준 (BOJ)' 카테고리의 다른 글

[Python] 백준/BOJ 18870번: 좌표 압축 (Silver 2)  (0) 2025.02.15
[Python] 백준/BOJ 2630번: 색종이 만들기 (Silver 2)  (0) 2025.02.08
[Python] 백준/BOJ 6593번: 상범 빌딩 (Gold 5)  (2) 2025.02.06
[Python] 백준/BOJ 11725번: 트리의 부모 찾기 (Silver 2)  (2) 2025.02.05
'Algorithm/백준 (BOJ)' 카테고리의 다른 글
  • [Python] 백준/BOJ 18870번: 좌표 압축 (Silver 2)
  • [Python] 백준/BOJ 2630번: 색종이 만들기 (Silver 2)
  • [Python] 백준/BOJ 6593번: 상범 빌딩 (Gold 5)
  • [Python] 백준/BOJ 11725번: 트리의 부모 찾기 (Silver 2)
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (140)
      • SSAFY (10)
      • Algorithm (67)
        • 이론 (5)
        • 백준 (BOJ) (61)
        • 프로그래머스 (1)
      • Language (9)
        • JavaScript (0)
        • TypeScript (0)
        • Java (9)
        • Python (0)
      • Library & Runtime (15)
        • React (13)
        • Node.js (2)
      • Framework (9)
        • 이론 (2)
        • Next.js (3)
        • Vue (4)
      • DevOps (3)
        • Git (3)
      • WEB (17)
        • HTML (9)
        • error (6)
        • etc (2)
      • Computer (5)
        • 자격증 (2)
        • tip (2)
        • etc (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
  • 블로그 메뉴

    • GitHub
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    kakaomap
    Error
    SSAFY
    소수
    오블완
    Algorithm
    html5
    github
    렌더링최적화
    Next.js
    자바
    재귀
    티스토리챌린지
    bfs
    vue
    딕셔너리
    강의
    React
    해시
    알고리즘
    dfs
    우선순위큐
    Java
    카카오맵
    SSAFYcial
    싸피
    블록체인
    DP
    백준
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
올콩
[Python] 백준/BOJ 21736번: 헌내기는 친구가 필요해 (Silver 2)
상단으로

티스토리툴바