강의

멘토링

커뮤니티

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

원재님의 프로필 이미지
원재

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-K와 문제의 단순화

3-K 질문있습니다.

해결된 질문

작성

·

29

0

안녕하세요 큰돌님:)

http://boj.kr/b242ee3c08074321874c8a8c4a09c09e

위와 같이 코드를 작성했습니다.

시간 초과를 생각해서 물인 부분을 모두 queue에 담았고 그 다음 이전 수업에서 알려주신 qsize를 정의해서 유사 플루드필(?)을 진행했습니다.

영상을 보니 백조가 있는 위치도 물로 지정해야 함을 이해했습니다. 다만 이 코드에서 시간 초과가 나는 이유는 백조의 탐색이 매번 이어지기 때문인가요?

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 원재님 ㅎㅎ

네 맞습니다.

이문제는 정말 시간초과가 빡센 문제라서... 하나라도 비효율적인 코드가 있으면 안됩니다.

    while(true) {
        memset(visited, 0, sizeof(visited));
        dfs(swanList[0].first, swanList[0].second, 1);

이부분이 비효율적이여서 시간초과가 나는 것 같습니다. 매번 초기화를 진행하지 말고 -> 진행한 visited 시점에서 초기화를 진행하지말고 그 시점에서 나아가면서 차곡차곡 visited를 채우는 식으로 진행하게 해주세요

 

 


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

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

백조의 위치를 물로 지정하고 시작하는 것은 BFS 초기화를 보다 효율적으로 하는 방법이며 이를 통해 탐색의 시작점을 줄일 수 있습니다. 하지만 시간 초과 문제는 여러 곳에서 발생할 수 있습니다. 구체적으로는 아래와 같은 방법으로 문제를 확인하고 해결할 수 있습니다.

  1. 큐 초기화 및 복사 비용 줄이기: 매 반복마다 큐의 상태를 전부 초기화하거나 복사하는 과정이 비효율적으로 동작할 수 있습니다. 이를 줄이는 방법 중 하나는 백조와 물의 상태를 별도의 큐로 관리해놓고, 매 사이클마다 갱신하는 것입니다.

  2. 방문 배열 활용: 방문 체크를 위해 사용되는 배열의 초기화와 갱신을 최적화해야 합니다. 예를 들어, 새로 방문한 위치만 별도로 기록하고, 매번 전체 배열을 초기화하지 않는 것이 좋습니다.

  3. 반복적인 탐색 로직 개선: 두 백조가 만날 수 있는 가능성을 매번 탐색하는 것은 시간 낭비가 클 수 있습니다. 즉 이미 탐색이 완료된 지점은 다시 탐색하지 않도록 체크해야 합니다.

관련 질문과 유용한 답변들이 있어 추가적인 최적화 방법을 참고하기에 좋은 게시물을 추천드립니다:

  • 3-K 코드 질문있습니다: BFS의 시간 복잡도를 최적화하는 다양한 테크닉이 다루어져 있으며, 플러드필과 효율적인 큐 사용법에 대해 자세히 설명되어 있습니다.

이 해답들은 시간 초과를 줄이기 위한 다양한 기법들을 소개하고 있으며, 이를 통해 보다 빠르고 효율적으로 답안을 개선할 수 있는 방법들을 발견할 수 있습니다.

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

원재님의 프로필 이미지
원재

작성한 질문수

질문하기