백준 2667 단지번호붙이기
Updated:
1. 문제
2. 풀이
'''
1: 집이 있는 곳
0: 집이 없는 곳
연결된 집들의 모임 = 단지
단지의 총 수, 각 단지의 집 수(오름차순) 출력
'''
# 행, 열 갯수 입력 받음
N = int(input())
# 연결 정보 저장용
myList = []
# 방문 표시 및 결과
visited = [[0 for _ in range(N)] for i in range(N)]
# 연결 정보 입력 받음
for _ in range(N):
m = list(input())
m = [int(_) for _ in m]
myList.append(m)
# 방향키: 좌, 우, 하, 상
directions = (0,1), (0,-1), (1,0), (-1,0)
que =[]
# 하나의 마을의 값을 받는 함수: 집이 몇 개 모여잇는지 출력
def home(point):
global myList, directions, visited, N, que
cnt = 1 #집 갯수 카운트 용
que.append(point)
tempx, tempy = point #오류2
visited[tempx][tempy] = 1
while que:
x,y = que.pop(0) #현재 좌표 x,y
for dx,dy in directions:
nextX = x + dx #인근 좌표 nextX, nextY
nextY = y + dy
if 0 <= nextX < N and 0 <= nextY < N and visited[nextX][nextY] == 0 and myList[nextX][nextY] == 1:
visited[nextX][nextY] = 1
que.append((nextX,nextY))
cnt += 1
return cnt
# 전체 정보에서 마을이 몇 개 있는지 확인하는 함수
def village():
result = []
global myList, directions, N
for a in range(N):
for b in range(N):
if visited[a][b] == 0 and myList[a][b] == 1: #오류1
point = (a,b)
var = home(point)
if var != 0:
result.append(var)
return result
# 결과 프린트
final = village()
final.sort() #오름차순 정렬
if len(final) == 0: #마을이 없는 경우
print(int(0))
else:
print(len(final))
for _ in final:
print(_)
# 내가 막힌 부분
# 1. 한 번에 모든 좌표를 다 훑고 마을 갯수를 구하려고 했음; 실패
# 창혁오빠 코드 보고, 두 개의 함수로 나누어 생각
# 2. 처음 생성한 home()은 (0,0)부터 시작하는 것, 어떻에 어느 좌표에서 시작하는지 알지?
# 방문 확인을 통해 한 번 방문한 곳은 다시 방문하지 않도록 함
# 3. 왜 오류나지?
# 반례) 3 \n101 \n010 \n101
# 오류1) myList[a][b] == 1 추가 작성; 방문한 적이 없으면서 방문하려는 좌표에 집이 있어야지 의미가 있기 때문