문제
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.
입력
첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)
출력
첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.
예제 입력 1 복사
6 5
1 1 0 1 1
0 1 1 0 0
0 0 0 0 0
1 0 1 1 1
0 0 1 1 1
0 0 1 1 1
예제 출력 1 복사
4
91 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | from collections import deque import sys input = sys.stdin.readline dx = [1, 0, -1, 0] dy = [0, 1, 0, -1] n, m = map(int, input().split()) vis = [[0] * m for _ in range(n)] board = [list(map(int, input().split())) for _ in range(n)] mx = 0 cnt = 0 size = 0 def BFS(a, b): global mx, cnt, size queue = deque() queue.append((a, b)) while queue: x, y = queue.popleft() for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0 <= nx < n and 0 <= ny < m: if board[nx][ny] == 1: size += 1 board[nx][ny] = 0 queue.append((nx, ny)) mx = max(size, mx) size = 0 for i in range(n): for j in range(m): if board[i][j] == 1: board[i][j] = 0 cnt += 1 size += 1 BFS(i, j) print(cnt) print(mx) | cs |
엄청 낑낑대면서 풀었는데 소스상에서 별로 좋지 않은 로직이나 코딩 습관이 있다면 지적해주시면 감사하겠습니다 ㅜㅜ
해당 댓글은 삭제되었습니다.
감사합니다 혹시 안좋은 코딩 습관같은 것도 딱히 없죠 ??
굳이 지적하자면 26번째줄과 같이 비교연산자 3개를 같이 쓰는건 c++에서는 지원하지 않기때문에 기억해둘 필요가 있음
아 넵 감사합니다