[백준]1012-유기농배추 with.Python

·

2 min read

💡문제 분석 요약

-- 문제 --

입력 : T = 테스트 케이스 , M = 가로 길이(1 ≤ M ≤ 50), N = 세로 길이(1 ≤ N ≤ 50), K = 배추가 심어져 있는 위치의 개수(1 ≤ K ≤ 2500), X,Y = 배추의 위치(0 ≤ X ≤ M-1, 0 ≤ Y ≤ N-1)

  • 어떤 배추에 지렁이가 한 마리라도 살고 있으면 (상하좌우)인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다.(두 배추의 위치가 같은 경우는 없다.)

💡알고리즘 설계

💡코드

💡시간복잡도

O(N)

💡틀린 이유

💡틀린 부분 수정 or 다른 풀이

import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline

# dfs 정의
def dfs(x, y):
    # 상하좌우
    dx = [0, 0, -1, 1] 
    dy = [1, -1, 0, 0]

    # 네 방향 탐색
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        # 범위 안에 있고 1이면(=배추이면) 지나간것을 -1로 표시하고 주변 탐색
        if (0 <= nx < m) and (0 <= ny < n) and graph[ny][nx] == 1:
            graph[ny][nx] = -1
            dfs(nx, ny)

t = int(input()) # 테스트 케이스의 개수
for _ in range(t):
    m, n, k = map(int, input().split()) # 가로, 세로, 배추 개수
    graph = [[0 for _ in range(m)] for _ in range(n)]

    # 배추 위치 표시
    for _ in range(k):
        X, Y = map(int, input().split()) 
        graph[Y][X] = 1 # X, Y 바꿔서 표시해야하는거 주의!

    # 배추 그룹 수(=배추흰지렁이 개수) 세기
    count = 0
    for a in range(m):
        for b in range(n):
            if graph[b][a] == 1:
                dfs(a ,b)
                count += 1
    print(count)

💡느낀점 or 기억 할 정보

  1. 처음 코테를 접하다보니 접근하는데 어려움을 느낌. -> 문제 많이 접해보기.

  2. 개념만 공부하지 말고 기본 구현한 코드 많이 접해보기.

  3. sys.setrecursionlimit(10**6) : 깊은 재귀 호출이 필요한 경우 재귀 한도 증가.

  4. graph[Y][X] : 2차원 배열을 표시 할 때 행,열 순서로 표기하기 때문에 순서 바꿔서 적어줘야함.

-출처 : https://dduniverse.tistory.com/entry/%EB%B0%B1%EC%A4%80-1012-%EC%9C%A0%EA%B8%B0%EB%86%8D-%EB%B0%B0%EC%B6%94-%ED%8C%8C%EC%9D%B4%EC%8D%AC-python 풀이법 익히는 것을 목표로 하였습니다.