jkjan   3년 전

세로줄이 최대 10개, 가로줄 영역이 최대 30개이므로

들어갈 수 있는 사다리 개수는 설령 연속 사다리를 허용하더라도

300C3 = 4455100, 약 445만가지로 제가 계산했는데,

이 정도면 적어도 경우 구하는데에서는 1초 안에 연산이 충분히 가능하지 않나요?

 

BFS 로 조합을 구한데다가, 

다음 번 사다리를 정할 때에는 항상 이전에 정했던 사다리 위치의 다음번부터 시작을 해서

중복이 있을 수가 없고 실제로 확인해보니 없습니다.

 

제 코드가 너무 메모리 초과가 나서

사다리를 내려서 i->i로 도착하는 걸 확인하는 걸 빼고

혹시나 하는 마음으로 경우의 수만 구해보자 했는데

여기서 아예 시간초과가 나버리네요.

 

가능한 사다리 배치 경우의 수가 16만개가 되는 예를 넣어봤는데

1초는 무슨, 5초 뒤에 프로그램이 종료됩니다.

사다리 경우의 수를 구하는 코드만 해결되면 될 거 같은데,

혹시 여기서 제가 잘못하고 있는 부분이 있을까요?

 

도와주시면 정말 감사하겠습니다.

  

저는 사다리의 상태를

세로 가로 세로 가로

세로 가로 세로 가로

....

로 나타내어진 배열 ladder[MAX_H+1][2 * MAX_N] 에 저장하였습니다.

따라서 인덱스와 사다리 번호는 다를 수 있습니다.

i번째 세로줄은 i번째 홀수이며

i번째 가로줄은 i번째 짝수입니다.

시간초과가 나는 예제는

10 5 30
1 3
3 2
4 7
5 5
9 5

입니다.

dfs로 완전 탐색해도 270만가지 밖에 안 나옵니다.

seico75   3년 전

* 일단 queue 에 vector를  넣는 것이 큰 부하로 보입니다.

vector 복사가 들어가는데 단순 배열이 아니기 때문에 vector 생성 및 element 복사까지 해야해서 꽤 시간차이가 나는 것으로 보입니다.

* 위 문제를 배열로 해결을 해도 메모리 문제가 생기는데.. 3이상의 깊이가 되는 것이 다 queue 에 넣어야 해서 그런 것 같습니다.

  3이상이면 queue 에 넣지 않으면 empty 가 되면서 끝날 것 같습니다.

* 114, 116, 118에서 ladder 로 비교를 하는 것이 맞나요? backUp 으로 해야하는 것은 아닌지..

  backUp 도 매번 만들어주는데 ladder 에 그냥 1를 넣고.. 끝나고 다시 0으로 되돌려줘도 될 것 같습니다.

* 전체 구조 유지하고 위 내용 수정하면 1.4 초로 통과하는 것 같습니다. (채점번호 21963092)

추가로 이 문제에서는 예제의 4,5 세로선 사이의 가로선을 3에 놓는 것과 4에 놓는 것이 결과에 차이가 없다는 사실을 이용하면 

시간이 많이 빨라질 수 있는 것 같습니다. 푸신 분들을 보면 10 ms 이하도 가능하네요. 

jkjan   3년 전

와... 댓글 달릴 거 기대 안 하고 있었는데 이렇게 친히 달아주시다니 정말 고맙습니다.

 

1. 제가 stl 을 시간 복잡도랑 사용법만 알지 그것에 따른 연산 부라 시간은 고려한 적이 없어서, 알고리즘이 맞아도 이런데에서 시간 초과가 날 수 있다는 걸 이제야 깨달았네요!

2. 3 이상이면 역시 안 넣어야겠네요. 제가 그렇게 한 적 있는데, 똑같이 메모리 초과가 나서 필요가 없나 했습니다.

3. ladder 로 비교하는 것이 맞습니다! ladder 에는 문제에서 주어진 가로 사다리만이 존재하기 때문입니다. 추가적으로 사다리를 놓는 건 backUp 에서만 시행합니다.

    다시 0으로 바꾸는 것, 원래 그러려고 생각했었는데 까먹고 그렇게 안 해버렸네요! 좋은 지적 감사합니다.

4. 정말 감사합니다! 제 로직 자체는 틀리지 않아서 한 시름 놓았네요. 그 맨 밑에 가로선은 사실 어디에 놔도 밑에 있기만 하면 상관 없다는 걸 인지는 하고 있는데

그걸 코드로 어떻게 구현할지 감이 안 와서 못하고 있었습니다. 이번 기회에 한 번 해봐야겠네요.

 

댓글 달아주셔서 정말 진심으로 감사합니다!

jkjan   3년 전

정말 감사합니다!!!!!!!!!!!!!!!!!!!

 

벡터를 dist를 마지막 인덱스로 활용하는 배열로 바꾸고,

3 이상이면 i->i 외의 작업은 하지 않고 스킵하고,

backUp 굳이 만들지 말고 사다리 놓은 것을 그대로 회수하는 방법으로 맞았습니다.

정말 감사합니다.

앞으로 복사가 자주 일어나는 곳에선 절대로 벡터를 쓰면 안 된다는 교훈을 얻었습니다.

귀찮아서 쓴 벡터가 이렇게 사람을 잡을 줄 몰랐네요.

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