-
[Python] BOJ 1926 : 그림코딩테스트/백준 2024. 10. 29. 07:58
요구사항, 설계
- 2차원 배열의 최대 크기가 2500이다. 시간 메모리 걱정 없다.
- 5분 생각하고 안 떠올라서 답지 봤다.
구현
from collections import deque # 가로 세로 크기 n, m = map(int, input().split()) # 도화지 canvas = [list(map(int, input().split())) for _ in range(n)] # 방문 여부 visited = [[False] * m for _ in range(n)] # 그림의 개수 num_of_pictures = 0 # 가장 넓은 그림 max_size = 0 def bfs(x, y): queue = deque([(x, y)]) visited[x][y] = True dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] size = 1 # 현재 도화지의 크기 while queue: cx, cy = queue.popleft() for i in range(4): nx, ny = cx + dx[i], cy + dy[i] if 0 <= nx <n and 0 <= ny < m and not visited[nx][ny] and canvas[nx][ny] == 1: visited[nx][ny] = True queue.append((nx, ny)) size += 1 return size for i in range(n): for j in range(m): if canvas[i][j] == 1 and not visited[i][j]: num_of_pictures += 1 max_size = max(max_size, bfs(i, j)) print(num_of_pictures) print(max_size)
- 답지 보니깐 하나씩 기억나서 익숙해 지려고 안보고 3번 정도 작성했다.
- 좀 헷갈렸 던 건 dx,dy 상하좌우 확인하는 부분과 왜 visited를 두 번 처리해야되나 생각했다.
- 상하 좌우 코드
# 현재 위치 x, y = 2, 2 # 상하좌우 이동을 위한 방향 벡터 dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] # 상하좌우 이동 for i in range(4): nx = x + dx[i] ny = y + dy[i] print(f"이동 방향 {i+1}: ({nx}, {ny})")
- 그냥 뭐 찍어봤는 데 아 그렇게 찍히는 구나. 외워서 그냥 요정에 맡긴다 생각하자.
- 상하 좌우 확인 하는 문제는 많기 때문에 딱 기본 틀만 외우고 나머지는 상황별로 살을 붙이면 좋을 듯하다.
- 왜 visited 를 두 번 처리해야 되느냐?
- 2중 for문이 돌면서 canvas가 1 인지와 방문여부가 거짓일 때
- bfs 함수로 들어간다.
- 이 때 들어가자마자 방문처리를 해줘야 들어간 좌표를 제외한 나머지의 상하 좌우를 확인할 수 있다.
앞으로
앞으로 BFS 유형만 풀게 될 텐데 한 유형에 계속 익숙해질 때까지 더 풀어보자.
고민이 되는 부분은 한 유형을 계속 알 때까지 파보는 것과 여러 유형을 한 개씩 풀어보는 게 도움이 될지.
음... 내 생각에는 한 유형씩 익숙해지고 대부분의 유형이 익숙해질 때 쯤 여러 유형을 한 개씩 풀어보는 게 나을 거 같다.
'코딩테스트 > 백준' 카테고리의 다른 글
[Python] BOJ 10026: 적록색약 (0) 2024.11.19 [Python] BOJ 2178 미로탐색 (0) 2024.11.01 [Python] BOJ 2504 괄호의 값 (0) 2024.10.28 [Python] BOJ 10799 : 쇠막대기 (0) 2024.10.24 [Python] BOJ 3986 : 좋은 단어 (2) 2024.10.23