[python] 백준 2667 단지번호 붙이기

hyewon9913·2024년 5월 8일

코딩테스트(python)

목록 보기
18/46

일단 문제를 해결하기위해 생각한 방법으로는 일반적인 미로찾기 방법을 살짝 변형해서 집이 있는 곳이라면 dfs 함수를 호출하고 해당 단지를 다 돌때까지 while문을 돌도록 코드를 작성해주었다.

이런 방식으로 코드를 작성해서 예시 답완과 같은 출력이 나오는데까지에는 성공했는데 예외로 인해 틀렸습니다가 떴다.

그 이유는 dfs 를 처음으로 호출해줄때 넣어주는 좌표에 대해서 방문처리를 해준 후 while문을 돌렸어야 했는데 그렇게 하지 않아서 문제가 발생했다.

from collections import deque



def dfs(graph,a,b):
    q = deque()
    q.append((a,b))

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

    #이 부분으로 인해 예외에 걸림
    graph[a][b] +=1

    
    while(q):
        x,y = q.popleft()
        for i in range(4):
            nx = dx[i] + x
            ny = dy[i] + y
            if 0 <= nx < n and 0<= ny < n and graph[nx][ny] == 1:
                q.append ((nx,ny))
                home_cnt+=1
                #visited 대신 값을 변경하여 방문여부 체크
                graph[nx][ny] +=1
    return home_cnt

n = int(input())

graph = []
for i in range(n):
    graph.append(list(map(int, input())))




home_list = []
for i in range(n):
    for j in range(n):
        if graph[i][j] == 1:
            home_list.append(dfs(graph, i,j))

print(len(home_list))

# for i in range(n):
#    print(graph[i])

for h in sorted(home_list):
    print(h)





        

*예외 처리를 안해줄때
입력:
5
10000
00011
00001
11000
11101

출력:
    4
    [1, 0, 0, 0, 0]
    [0, 0, 0, 2, 2]
    [0, 0, 0, 0, 2]
    [2, 2, 0, 0, 0]
    [2, 2, 2, 0, 1]
    1
    1
    4
    6
    

*예외처리 해준 후

입력:
5
10000
00011
00001
11000
11101
출력:

  4
  [2, 0, 0, 0, 0]
  [0, 0, 0, 2, 2]
  [0, 0, 0, 0, 2]
  [2, 2, 0, 0, 0]
  [2, 2, 2, 0, 2]
  1
  1
  3
  5

예외처리를 안해주면 처음 좌표와 마지막좌표가 방문처리가 안되는 것을 볼 수 있다.
예외처리에 대해서 잘 생각하면서 코드를 작성해야겠다.

profile
차근차근 굴러가는 코딩일지

0개의 댓글