스파르탄 365 3주차 (3) 유기농 배추

새벽하늘·2021년 4월 28일
0
post-thumbnail

3주차

백준 1012번 단지번호붙이기

문제링크 : https://www.acmicpc.net/problem/1012

💡 풀이 전 계획과 생각

  • 상하좌우 좌표를 이용하는 문제니 저번에 풀었던 섬의 개수 문제를 응용하여 풀자
    -> BFS를 이용하려 했으나 실패.. ㅠ (실패 원인을 아직 파악하지 못함)

💡 풀이

import sys
input = sys.stdin.readline

test_case = int(input())

def dfs(x, y):
    visited[x][y] = True
    dirs = [(0, 1), (0, -1), (-1, 0), (1, 0)]
    for dx, dy in dirs:
        nx, ny = x + dx, y + dy
        if nx<0 or nx>=n or ny <0 or ny>=m:
            continue
        if plot[nx][ny] and not visited[nx][ny]:
            dfs(nx, ny)

for _ in range(test_case):
    m, n, k = map(int, input().split())
    plot = [[0]*m for _ in range(n)]
    visited = [[False]*m for _ in range(n)]

    for _ in range(k):
        # velog
        y, x = map(int, input().split())
        plot[x][y] = 1

    cnt = 0
    for i in range(n):
        for j in range(m):
            if plot[i][j] and not visited[i][j]:
                dfs(i, j)
                cnt += 1

    print(cnt)

🧐 막혔던 점과 고민

  • 대체 어느 부분에서 오류인지 아직 찾지 못했다.
  • visited를 최대한 이용하는 부분으로 코드를 짜고 싶었다.

👏🏻 알게된 개념과 소감

  • 상하좌우, 총 4번을 반복해서 좌표 변경 (다른 방법)
def dfs(x, y):
    visited[x][y] = True
    dirs = [(0, 1), (0, -1), (-1, 0), (1, 0)]
    for dx, dy in dirs:
        nx, ny = x + dx, y + dy
        if nx<0 or nx>=n or ny <0 or ny>=m:
            continue
        if plot[nx][ny] and not visited[nx][ny]:
            dfs(nx, ny)
  • 계속 쓰이는 입력 방법
 m, n, k = map(int, input().split())
    plot = [[0]*m for _ in range(n)]
    visited = [[False]*m for _ in range(n)]
  • ??? 왜 .. 왜.. y가 먼저지.. 왜...
  • 이해는 잘 가지 않지만 디버깅해보니 이렇게 해야 사람이 원하는 데로 컴퓨터가 받아들임을 알 수 있었다. y, x가 아닌 x, y 순으로 받으면 범위 초과 오류도 나왔다.
  • 우선은 암기로 받아들이고 멘토님께 여쭤야 겠다.
  for _ in range(k):
        # velog: 우선은 외우자.. 
        y, x = map(int, input().split())
        plot[x][y] = 1
profile
만들고 싶은 거 다 만들 수 있는 그날까지

2개의 댓글

comment-user-thumbnail
2021년 4월 29일

안녕하세요. 저는 튜터님은 아니지만... 가로가 x이고 세로가 y인데
x,y = map(int, input().split())
plot[x][y] = 1
이라고 하면 안 되고 y,x =이라고 써야 하는 이유는...
우리 눈으로 보는 좌표에서는 가로가 x이고 세로가 y니까 x가 먼저고 y가 다음일 것으로 보이지만, 그것을 2차원 행렬에 넣었을 때에는 '가로' 좌표는 '열'이고 '세로' 좌표는 '행'이기 때문에 순서가 반대인 것으로 알고 있습니다. 예를 들어 위의 문제 스크린샷에 나와 있는 그림에서 가로를 x, 세로를 y로 쓰면 (3,4)에 배추 1이 있는 그림으로 되어 있는데요, 2차원 행렬에서의 좌표는 4째줄 3번째칸(4행 3열)의 값을 1로 만들어야 하기 때문에 3 4를 입력받고 plot[4][3]=1을 저장해줘야 하죠. x좌표는 열이고 y좌표는 행이니까 '행렬'을 나타내는 2차원 배열에서는 y와 x의 순서가 바뀌면 됩니다.

1개의 답글