Logo
(追記) (追記ここまで)

시간 초과 나는 부분은 알 것 같은데, 수정을 못하겠습니다.

9019번 - DSLR

2~3일간 짬짬히 생각해봤는데, 어느 부분을 최적화하면 시간 초과를 해결할 수 있을지 알 것 같은데 아직 알고리즘을 많이 해보지 않아서 어떻게 적절하게 고쳐야할지 감이 오질 않습니다. 도움 부탁드립니다!

제가 생각한 최적화가 필요한 부분을 표시해 뒀는데, 아니라면 정정해주시면 감사하겠습니다.

1. 46번째줄에 q.resize()를 하면서 1만개의 공간을 미리 잡아두어 초기 값이 생성되어 있어 불필요한 연산을 합니다

2. 큐의 현재 값이 en값과 같을 경우 q.second를 출력하고 함수를 종료시킵니다.

앗 감사합니다! 글 올리기 전에 고쳤는데, 반영이 안된 것 같습니다! 수정 했는데, 혹시 여기서 문제점은 무엇일까요...?

2번 항목을 확인해보세요

2번 항목이 왜 문제인지 모르겠습니다. 우선 입력은 A != B로 들어온다고 했고, 이후에 queue값이 en과 같으면 끝나게 하는게 맞지 않나요?

while문을 아래처럼 바꾸고, 꺼낸 res값에 바꾼 연산을 대입시켜줘야 합니다. 현재 코드로는 아무 값도 출력되지 않습니다.

현재 while문 조건 코드가 어떻게 되어있나요? 제가 변경한 코드는 아래와 같은데, 이게 원본 코드에 반영이 안되어있나요? 만약 반영 되어있다면 저는 잘 나옵니다..!

그러면 q.empty()를 먼저 검사하는걸로 바꾸시고, res에 fptr연산을 대입해보세요.

다른 bfs 문제를 풀 때도 q가 비어있는지 먼저 확인을 해야 q.front() 실행 시 SegFault가 발생하지 않습니다

일단 저 while문 조건 그대로에 함수 포인터가 가지고 있는 함수들을 함수 내부에 넣어서 제출했더니 답은 맞았습니다.

말씀해주신 것 처럼 q.empty()를 먼저 확인해야할 것 같긴 합니다!

근데 여기서 여쭤보고 싶은게, 첫 댓글에 작성한 코드는 모든 함수를 강제적으로 inline화하고, 매개 변수도 레퍼런스로 받게끔 수정했는데, 아래와 시간 차이가 그렇게 크게나는지 궁금합니다. 인라인화 하면 퍼포먼스는 거의 비슷한 걸로 알고 있는데, D, S, L, R 함수 내부에서 리턴 변수 res를 생성하는게 비용이 커서 그런걸까요? 아니라면, 혹시 뭐때문인지 짐작 가시는게 있으신가요?

D, S, L, R 이미 4번 연산을 다 했는데 for문을 돌릴 이유가 없지 않나요 위에 올리신 코드는 DSLR DSLR DSLR DSLR 총 4번씩 불필요한 연산을 하고있습니다

앗 맞습니다.! 얼른 보여드리려고 해서 자꾸 코드 실수 하네요 죄송합니다.

우선 가장 중점적으로 여쭤보고 싶은건, 첫 댓글에 작성한 코드는 모든 함수를 강제적으로 inline화하고, 매개 변수도 레퍼런스로 받게끔 수정했는데, 아래와 시간 차이가 그렇게 크게나는지 궁금합니다

최종 최적화는 아래와 같은 코드로 마쳤습니다.

그런데 제가 궁금한건 해당 문제에서 함수 호출을 하지 않고, BFS의 while문 내부에 D, S, L, R연산을 구현한 경우와 함수 호출(제가 첫번째 올린 코드에서 함수 포인터를 이용한 함수 호출)을 이용했을 때의 차이가 그렇게 크게 나는지 입니다!

while 문 내부에서 돌리는 로직이 더 빠르게 돌아가고 있습니다.

while문 내부에서 돌리는 로직은 시간 초과가 발생하지 않고, 함수 호출은 시간 초과가 발생합니다.

함수에 있는 부분을 아래처럼 바꾸면 어떻게 되나요?

아무 변화도 없습니다. 아마 어셈블리단에서는 변할게 없는 코드여서 속도 차이가 없는 것 같습니다.

그리고 앞에서 말씀해 주셨던, 'c'와 "c"의 차이는 없을 것 같습니다.

res.second는 string으로 string + 문자(or 문자열)의 경우 string으로 캐스팅 돼서 둘 모두 string 객체화 된 뒤에 res.second와 합쳐집니다.

제 생각에는 함수 호출 비용 때문인 것 같습니다. 내부적으로 초기화 할 부분은 더 이상 없어 보입니다!

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

(追記) (追記ここまで)

출처

대학교 대회

  • 사업자 등록 번호: 541-88-00682
  • 대표자명: 최백준
  • 주소: 서울시 서초구 서초대로74길 29 서초파라곤 412호
  • 전화번호: 02-521-0487 (이메일로 연락 주세요)
  • 이메일: contacts@startlink.io
  • 통신판매신고번호: 제 2017-서울서초-2193 호

AltStyle によって変換されたページ (->オリジナル) /