강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

정중한 몽구스님의 프로필 이미지
정중한 몽구스

작성한 질문수

38군데 합격 비법, 2025 코딩테스트 필수 알고리즘

4-9. 4주차 끝 & 숙제 설명

큐에 항상 하나의 값만 들어가는데 문제풀이에 bfs를 떠올리신 이유가 궁금합니다.

해결된 질문

작성

·

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와 큐 사용의 이유

  1. BFS의 본질적인 특성:

    • BFS는 너비 우선 탐색으로, 그래프나 트리 구조에서 모든 이웃 노드를 처음부터 끝까지 탐색해 나가는 방식입니다. 이를 위해 모든 탐색 노드를 체계적으로 관리하기 위한 자료구조가 큐입니다. 큐는 FIFO(First In First Out) 구조이기에 BFS 구현에 적합합니다.
  2. 큐의 사용 패턴:

    • 문제 상황에 따라 어떤 경우에는 큐에 동시에 여러 값이 들어갈 수 있고, 어떤 상황에서는 하나만 남아 있을 수도 있습니다.
    • BFS 자체가 처음부터 끝까지 해당 레벨의 모든 노드를 확장(search)을 완료하고 나서 그다음 레벨로 넘어갈 때마다 탐색 범위를 확장해 나가는 방식이기 때문입니다.
  3. 문제 풀이:

    • 문제에 따라 다르겠으나, 청소기 문제처럼 특정 조건 아래서만 큐에 하나의 값이 남아 있을 수도 있습니다. 하지만 BFS의 본질적인 탐색 메커니즘을 유지하기 위해 큐 자료구조는 여전히 적합합니다.
    • 따라서, 현재 적용된 알고리즘이 문제의 최적 해를 찾기에 적절한지 고려해야 합니다.

질문해주신 청소기 문제에서도 BFS는 강력한 탐색 알고리즘으로, 다양한 조건이나 상황에 맞춰서 노드를 탐색할 때 적합합니다. 때로는 여러 노드가 큐에 들어갈 수도, 하나의 값만 존재할 수도 있지만 이러한 구조를 통해서 문제를 체계적으로 풀어나갈 수 있습니다.

관련해서 다른 학습자분들의 문제 풀이 및 BFS 사용 사례를 보고 싶으시면 다음 유사한 질문을 참고해 보세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

정중한 몽구스님의 프로필 이미지
정중한 몽구스

작성한 질문수

질문하기