* 일단 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년 전
세로줄이 최대 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만가지 밖에 안 나옵니다.