본문 바로가기
> 알고리즘 문제 풀이/BOJ

**1012-유기농 배추 (python, 파이썬)

by bky373 2020. 10. 18.

1번: 내가 작성한 코드 
- 핵심 로직!!
  - (0,0)부터 (M,N)까지 방문하지 않은 곳 탐색
    - 이제 지금 이곳은 방문했으니 visited = True
    - 만약 배추(1)가 있는 지점이면
      - cnt +1 !
      - 그리고 BFS 돌리기~~
      (BFS) - queue에 해당 좌표를 넣고, while 반복문 안에서 현좌표와 상하좌우로 연결되는 지점을 방문한다!
                - 장차 지점의 위치가 0보다 작거나 경계값이면 continue
                - 지점을 처음 방문하고 and 배추(1)가 있다고 하면
                  - queue에 해당 지점의 좌표를 append!
                   (여기서부터 또 연결된 배추무리를 찾아야하기 때문에 넣는다)

T = int(input())

dx, dy = [0, 1, 0, -1], [1, 0, -1, 0]

def BFS(i, j):
    queue = [(i, j)]
    while queue:
        cur = queue.pop(0)
        i, j = cur[0], cur[1]
        for w in range(4):
            ii, jj = i+dx[w], j+dy[w]
            if ii < 0 or ii == N or jj < 0 or jj == M:
                continue
            if not visited[ii][jj] and G[ii][jj]:
                visited[ii][jj] = 1
                queue.append((ii, jj))


for _ in range(T):
    M, N, K = map(int, input().split())
    G = [[0] * M for _ in range(N)]
    visited = [[0] * M for _ in range(N)]
    cnt = 0
    
    for _ in range(K):
        x, y = map(int, input().split())
        G[y][x] = 1

    for i in range(N):
        for j in range(M):
            if not visited[i][j]:
                visited[i][j] = 1
                if G[i][j]:
                    cnt += 1
                    BFS(i,j)
    print(cnt)




2번: 1번 성공 후 참고한 코드

import sys
sys.setrecursionlimit(10000)

T = int(input())
B, ck = [], []

dx, dy = [1, 0 , -1, 0], [0, 1, 0, -1]

def dfs(x, y):
    global B, ck
    ck[x][y] = 1
    for i in range(4):
        xx, yy = x + dx[i], y + dy[i]
        # 배추가 없거나 이미 방문했으면 넘어간다
        if B[xx][yy] == 0 or ck[xx][yy]:
            continue
        dfs(xx, yy)

def process():
    global B, ck

    M, N, K = map(int, input().split())
    B = [[0 for i in range(M+2)] for _ in range(N+2)]
    ck = [[0 for i in range(M+2)] for _ in range(N+2)]
    for _ in range(K):
        X, Y = map(int, input().split())
        B[Y+1][X+1] = 1
    ans = 0
    for i in range(1, N+1):
        for j in range(1, M+1):
            if B[i][j] == 0 or ck[i][j]:
                continue
            dfs(i,j)
            ans += 1
    print(ans)

for _ in range(T):
    process()




- 3번: 배운 점
  - 재귀를 쓰면 depth 제한으로 런타임 에러가 발생할 수 있다!
    (이를 막기 위해, sys.setrecursionlimit(number)를 사용할 수 있지만 실제 시험장에서는 가능여부 불확실)
  - 좌표가 0 미만이거나 경계값에 걸리지 않도록 M, N을 각각 +1씩 해주고, (1,1)부터 탐색을 시작한다!
  - 문제의 가로 길이, 세로 길이에 대한 설명을 꼼꼼히 읽는다 

 

댓글