dlqudgus2587   4년 전

질문 게시판에 있는 반례랑 테스트 케이스는 다 잘 돌아가는데 시간초과에서 계속 걸리네요..

중요도와 몇 번째 문서인지를 멤버로 갖는 구조체를 정의해서, 그 구조체를 데이터로 갖는 큐를 만들었습니다.

다른 글 보니까 정렬을 이용하시던데 그 부분이 잘 이해가 안가서 적용은 못했습니다. 입력한 순서가 중요한 것 같은데 정렬을 하면 그게 섞여서 문제가 생겨서 답이 제대로 출력이 안 됐습니다(아래 코드는 정렬 없이 작성한 코드입니다.)

시간을 줄이는데에 조언을 구하며, 이 문제에 왜 정렬을 써야하는 지도 혹시 답변해 주시면 감사하겠습니다.

79brue   4년 전

이 문제는 다양한 방법으로 풀 수 있는데, 그 중 제가 생각한 방법은 크게 3가지입니다.

  1. 배열을 이용해 직접 큐를 구현해서 푼다. 시뮬레이션을 직접 돌려 가며, 각 문서마다 중요도가 더 높은 문제가 있는지 확인한다.
  2. multiset에다가 모든 중요도를 넣어 놓고, 문서를 하나씩 출력할 때마다 그 문서에 해당하는 중요도를 제거해 나간다.
  3. 중요도는 겨우 9가지뿐이므로, "arr[k] = 중요도가 k인 문서의 개수"와 같은 식으로 배열을 만들고, 중요도가 더 높은 문서가 있는지 간단하게 확인한다.

아마 시간 복잡도로 따지면 3번이 가장 좋지만, 모두 제한 시간을 통과할 수 있을 겁니다.

dlqudgus2587   4년 전

79brue님 답변 감사드립니다ㅎㅎ 바빠서 며칠 못들어오다가 이제 봤네요ㅠㅠ 

그런데 제가 푼 방법도 3번의 방법과 같은 방법이 아닌가요?? 중요도를 저장하는 배열 importance를 선언하여서 중요도가 k인 문서의 개수를 importance[k]가 표현하게 코드를 짰는데 시간초과가 뜨네요ㅠㅠ 뒤에 언급하신 '중요도가 더 높은 문서가 있는지 간단하게 확인한다' 에서 걸린 것 같은데, 나름 if문으로 간단하게? 구성을 해봤는데 시간초과가 뜨네요.. 1, 2번의 방법으로도 지금 해볼 건데 혹시 제가 한 방법(79brue님께서 추천해주신 3번 방법과 유사한..?)에서는 어떻게 수정해야 할 지 간단하게 말씀해주실 수 있나요ㅠㅠ 감사합니다.


79brue   4년 전

보니까 queue를 직접 구현하시는데, 이렇게 하지 않고 배열을 이용한 방식으로 구현하면 훨씬 편하고, 보는 입장에서도 이해하기 편할 것 같습니다.  이 문제는 N이 그리 크지 않으니 배열로도 될 것 같네요. 

dlqudgus2587   4년 전

79brue님 답변 재차 감사드립니다ㅎㅎ 그런데 배열로 이용한다고 쳤을 때, 예를 들어서 중요도가 1,2,3,4 인 순서로 저장되었을 때, 4부터 프린트를 해야 하잖아요. 그럼 1을 빼고, 2~4를 한 칸씩 앞으로 땡겨오고, 그 다음에 1을 맨 뒤에 넣고, 2, 3 도 똑같은 방식으로 하면 이게 시간복잡도가 더 크게 나오는 것 아닌가요..? 

dlqudgus2587   4년 전

일단 배열을 이용해서 코드를 짜 보고 있습니다! 한 번 해보겠습니다ㅎㅎ 해보지도 않고 질문 하는 건 예의가 아닌 것 같다고 이제와서 느꼈네요.. 죄송합니다.

79brue   4년 전

저랑 시간대가 절묘하게 겹치시네요...

한 칸씩 앞으로 당겨 오는 것이 아닙니다. 1을 뺀 뒤, 맨 앞이 가리키는 위치를 한 칸 오른쪽으로 옮기면, 맨 앞이 가리키는 위치는 2가 됩니다.

즉, size 변수만 만드는 것이 아닌, front와 back 변수를 만들어 큐를 제어하는 겁니다.

dlqudgus2587   4년 전

79brue님 답변 감사드립니다ㅎㅎ 군인이라서 밤에 연등하고 코딩하는 경우가 많네요..

답변자님 말씀대로 front, back 변수를 만들고 배열을 이용해서 큐를 원형으로 구현하니까 정말 스무스하게 4일만에 해결했네요.. 너무 뿌듯합니다. 이런 방식으로 푸니까 확실히 시간이 많이 단축이 됐네요. 답변 감사드립니다!!

79brue   4년 전

제 답변이 도움이 되었다니 기쁩니다.

dlqudgus2587   4년 전

많은 도움 됐어요ㅎㅎㅎ 앞으로 궁금한 거 생기면 22시에 글 올려야겠어요!

댓글을 작성하려면 로그인해야 합니다.