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

이세찬님의 프로필 이미지
이세찬

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

12. 토마토(BFS)

타임에러가 왜 나타나는지 모르겠습니다

작성

·

68

0

 static void solution(Queue<Point> q, int[][] box) {
        while (!q.isEmpty()) {
//            int len = q.size();
//            for (int i = 0; i < len; i++) {
                Point tmp = q.poll();
                for (int j = 0; j < 4; j++) {
                    int nx = tmp.x + dx[j];
                    int ny = tmp.y + dy[j];
                    if (nx >= 0 && ny >= 0 && nx < n && ny < m && box[nx][ny] == 0) {
                        box[nx][ny] = 1;
                        q.offer(new Point(nx, ny));
                        dis[nx][ny] = dis[tmp.x][tmp.y] + 1;
                    }
//                }
            }
        }
    }

위에서 주석처리된 queue의 사이즈를 구한 후 레벨 탐색(?)으로 진행하게 되면 타임에러가 발생하는데 왜 발생하는지 모르겠습니다. 성능 차이가 많이 나나요 ?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

Java에서 타임 에러가 발생하는 주된 이유 중 하나는 효율성 문제로 인하여 주어진 시간 내에 코드가 종료되지 않을 때입니다. 주석 처리된 부분을 포함하여 레벨 탐색(너비 우선 탐색 - BFS)을 진행하게 되면, 각 레벨마다의 요소를 처리하기 위해 추가적인 반복문이 사용되어 시간 복잡도가 증가합니다.

주석 처리된 코드에서 int len = q.size(); 로 큐의 길이를 측정하고, 이를 기반으로 for문을 돌리게 되면, 현재 레벨에 대한 모든 요소들을 한 번에 처리할 수 있으나, 이 과정에서 매번 큐의 사이즈를 체크하고, 각 요소마다 인접한 요소를 탐색하여 큐에 추가하는 과정은 큐에 들어있는 요소의 수만큼 반복적으로 실행됩니다. 특히, 탐색해야 하는 공간이 크거나, 탐색 조건이 복잡할 경우, 이러한 반복 과정이 시간 복잡도를 크게 증가시켜 타임 에러를 유발합니다.

성능 차이가 발생하는 이유는 추가적인 반복문이 모든 요소를 순회하며, 각 요소에 대해 인접한 요소를 큐에 추가하는 동안, 큐의 크기가 계속 변하기 때문입니다. 이러한 과정은 많은 수의 요소가 큐에 들어가고 처리되어야 할 때, 특히 그래프의 규모가 클 때 매우 비효율적일 수 있습니다.

따라서, 레벨 별 탐색을 통해 문제를 해결하고자 할 때는, 시간 복잡도를 고려하여 최적화된 방법을 선택하는 것이 중요합니다. 만약 타임 에러를 해결하고 싶다면, 코드의 효율성을 개선할 다른 방법들을 찾아보는 것도 좋은 접근 방법이 될 수 있습니다.

원하는 답을 찾지 못하셨나요?
그럼 직접 문의해보시는 것도 좋은 방법이 될 수 있습니다.

이세찬님의 프로필 이미지
이세찬

작성한 질문수

질문하기