백준 2468 안전 영역 (실버 1)
링크: 2468 안전 영역
접근 방법
- 높이 1부터 가장 높은 부분 전까지 반복
- dfs로 풀이
- 최악 N, N^2 이므로 dfs 사용 가능함
소스 코드
소스 코드: 93413770 제출
import sys
# 입력
input = sys.stdin.readline
N = int(input())
graph = []
max_height = 0
for _ in range(N):
line = [int(i) for i in input().split()]
graph.append(line)
max_height = max(max(line), max_height) # 최대 높이 구하기
# dfs
delta_x = [1, -1, 0, 0]
delta_y = [0, 0, 1, -1]
def dfs(visited: set, height: int, start_x: int, start_y: int):
queue = [(start_x, start_y)]
visited.add((start_x, start_y))
while len(queue) > 0:
x, y = queue.pop()
for i in range(len(delta_x)):
new_x = x + delta_x[i]
new_y = y + delta_y[i]
if 0 <= new_x < N and 0 <= new_y < N:
if (new_x, new_y) not in visited and graph[new_x][new_y] > height:
visited.add((new_x, new_y))
queue.append((new_x, new_y))
# 높이와 지점 설정
max_safe_area = 1
for height in range(1, max_height):
visited = set()
safe_area = 0
for x in range(N):
for y in range(N):
if graph[x][y] > height and (x, y) not in visited:
dfs(visited, height, x, y)
safe_area += 1
max_safe_area = max(max_safe_area, safe_area)
print(max_safe_area)
코드 개선 사항(GPT 4o)
# 전
while len(queue) > 0:
# 후
while queue:
- queue는 iterable 하기 때문에 해당 방식으로 구현해도 문제 없음
# 전
for i in range(len(delta_x)):
# 후
for dx, dy in zip(delta_x, delta_y):
- 이게 더 직관적인 것 같다.
- len() 함수도 사용하지 않아도 되고, 값을 그대로 사용하기 때문에 코드 오타 문제도 적어질 것으로 예상
결론
- 문제를 푸는데, 어려움은 없었다.
- 하지만 GPT가 더 범용적인 코드를 사용하게 좋다는 조언을 했는데, 문제에 맞춘 코드보다 어느 코드에서나 쓰일 수 있게 작성하는게 확실히 좋아보인다.
728x90
반응형
'개발 노트 > 알고리즘 문제' 카테고리의 다른 글
백준 10162 전자레인지 (브론즈 3) (0) | 2025.04.27 |
---|---|
백준 11660 구간 합 구하기 5 (실버 1) (0) | 2025.04.22 |
백준 1629 곱셈 (실버 1) (1) | 2025.04.20 |
백준 15686 치킨 배달 (골드 5) (0) | 2025.04.19 |
14889 스타트와 링크 (실버 1) (0) | 2025.04.17 |