인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

이명운님의 프로필 이미지

작성한 질문수

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

5-H

5-H 질문

작성

·

106

0

안녕하세요 큰돌님 문제를 다시 풀어보다가 의문이 생겨서 질문 드립니다.

우선 저는 해당 인덱스를 확인해보며 해당인덱스까지의 경우의 수를 확인해보고 해당 루프마다 ret에 경우의수를 더해주는 방식으로 문제를 풀었습니다

근데 제 풀이의 경우 visited배열을 방문해제할때 for문으로 확인하는 방식이라 시간복잡도가 O(N^2) 일거라 생각하고 당연히 틀렸겠지 하고 그냥 제출해봤는데 맞아서 의문입니다.
왜 맞은걸까요?

고민을 해봤는데 이해가 잘 안되서 질문드립니다.

감사합니다
http://boj.kr/329316d089c24e2896b8062b2a367efb

답변 2

1

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

안녕하세요 명운님 ㅎㅎ

코드가 너무 좋네요 ㅎㅎ

저도 처음에 이코드보고 O(N)인데 통과하려나 했던 코드인데 제 생각에는 아마 이부분 때문에 통과하는 것 같습니다.

            ll c = find(v.begin(), v.end(), n) - v.begin();
            for (ll i = 0; i < c; i++) visited[v[i]] = 0;
            v.erase(v.begin(), v.begin() + c + 1);

계속해서 v에서 필요없는 부분을 지워주고 있기 때문에 해당 부분이 private TC에서 효율적으로 작동되어서 그런 것 같습니다.
그러나 이부분은 O(N)이 맞기 때문에 (find 때문에) 제 코드 기반 다른 방법도 숙지를 해두셔야 합니다.

 

간만에 보는 깔끔한 코드네요 ㅎㅎ

 

감사합니다.



이명운님의 프로필 이미지
이명운
질문자

감사합니다.! 좀더 시간복잡도 생각해보며 다양한 풀이방법으로 접근해보겠습니다.

항상 좋은 코드 감사합니다

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 이명운님.

이명운님께서 사용하신 방식이 의도치 않게 주어진 입력 데이터의 특성이나 제한 조건과 잘 맞아떨어져 제출 시 정답으로 처리된 경우가 많은 알고리즘 문제 풀이에서 발생하곤 합니다.

문제 해결 시 왜 정답으로 처리되었는지 분석

  1. 최악의 상황이 발생하지 않음: 백준과 같은 알고리즘 평가 사이트에서는 모든 가능한 입력이 주어지지 않는 한, 최악의 시간복잡도를 직접적으로 경험하는 경우는 드뭅니다. 따라서 O(N^2)과 같은 시간복잡도 알고리즘이 실제로 실행되는 도중 시간 제한을 통과할 수 있습니다.

  2. 데이터의 특성: 주어진 문제 데이터가 특정 패턴을 가지고 있어서 생각보다 많은 부분이 효율적으로 처리되었을 가능성도 있습니다. 데이터의 특성이 특정 알고리즘의 비효율적인 부분을 피할 수 있습니다.

  3. 부분적으로 효율적인 구현: ‘visiting’을 해제하는 부분을 포함해서 알고리즘의 나머지 부분이 평균 케이스에서는 매우 효율적으로 작동할 수 있습니다.

시간복잡도를 보다 정확히 개선할 수 있도록 ‘슬라이딩 윈도우’, ‘투 포인터’와 같은 방법론적 접근을 통해 해당 문제를 한 번 더 살펴보시면 좋은 연습이 될 것 같습니다.

아래 링크를 통해 보다 최적화된 방법을 찾아보길 추천드려요: 5-H 문제 최적화 풀이

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