해결된 질문
작성
·
30
0
몇 챕터/몇 강을 수강 중이신가요? 4.9
어떤 알고리즘을 학습하고 계신가요?
bfs, 숙제 두번째 청소기 문제
여기까지 이해하신 내용은 무엇인가요?
문제 풀이 강의 보면서 같이 풀고, ai 사용해서 공부한상태, 일주일 뒤에 다시 풀 예정입니다
큐에 들어가는 값이 항상 하나밖에 존재하지 않는데 큐를 사용하시는 이유가 궁금합니다.
답변 2
0
안녕하세요 몽구스님 좋은 질문 감사합니다!!
맞습니다! 이 로봇 청소기 문제는 일반적인 BFS와 다릅니다. 로봇이 청소할 곳을 찾는 즉시 바로 그 곳으로 이동하기 때문에, 큐에는 항상 현재 위치 하나만 존재하게 됩니다.
일반적인 BFS라면 미로 탈출 같은 문제에서 queue = [(1,1), (1,2), (2,1)]
처럼 여러 위치를 동시에 탐색하지만, 청소기 문제에서는 queue = [(7,4,0)]
처럼 로봇의 현재 위치와 방향 하나만 있죠.
그럼에도 굳이 큐를 사용한 이유는 구조적 일관성 때문입니다. BFS 패턴을 유지해서 코드를 이해하기 쉽게 만들었습니다. "탐색 문제구나!"라고 바로 알 수 있거든요. 그리고 while문으로 계속 진행하다가 더 이상 갈 곳이 없으면 자연스럽게 종료됩니다.
물론 이 문제는 재귀나 단순 while문으로도 구현할 수 있습니다
def clean_with_recursion(r, c, d, room_map):
room_map[r][c] = 2
count = 1
while True:
temp_d = d
can_move = False
for i in range(4):
temp_d = (temp_d + 3) % 4 # 왼쪽 회전
new_r, new_c = r + dr[temp_d], c + dc[temp_d]
if room_map[new_r][new_c] == 0: # 청소할 곳 발견
r, c, d = new_r, new_c, temp_d
room_map[r][c] = 2
count += 1
can_move = True
break
if not can_move: # 4방향 모두 막힘
back_d = (d + 2) % 4
back_r, back_c = r + dr[back_d], c + dc[back_d]
if room_map[back_r][back_c] == 1: # 뒤도 벽
break
else:
r, c = back_r, back_c # 후진
return count
시뮬레이션 문제라면 단순 while문이 더 직관적일 수 있어요. 하지만 BFS 패턴을 사용하면 코드 리뷰할 때 "아, 탐색 문제구나" 바로 인식 가능하고, 나중에 문제가 변경되어도 확장하기 쉽고, 면접에서도 "BFS로 접근했다"고 명확하게 설명할 수 있어서 이와 같이 구현했습니다
넘넘 좋은 질문 감사합니다!이런 식으로 "왜 이렇게 구현했을까?"를 계속 생각하시면 알고리즘 실력이 훨씬 빨리 느실 것 같습니다 언제든 편하게 질문 해주세요 좋은 하루 되시길 바랍니다
0
안녕하세요, 인프런 AI 인턴입니다. 정중한 몽구스님.
질문해주신 내용은 BFS(Breadth-First Search)에 관한 것입니다. BFS에서는 큐(queue)를 사용하는 것이 기본 원칙입니다. 이때, 큐에 들어가는 값이 항상 하나밖에 존재하지 않는데 왜 큐를 사용해야 하는지 궁금하셨군요.
BFS의 본질적인 특성:
큐의 사용 패턴:
문제 풀이:
질문해주신 청소기 문제에서도 BFS는 강력한 탐색 알고리즘으로, 다양한 조건이나 상황에 맞춰서 노드를 탐색할 때 적합합니다. 때로는 여러 노드가 큐에 들어갈 수도, 하나의 값만 존재할 수도 있지만 이러한 구조를 통해서 문제를 체계적으로 풀어나갈 수 있습니다.
관련해서 다른 학습자분들의 문제 풀이 및 BFS 사용 사례를 보고 싶으시면 다음 유사한 질문을 참고해 보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.