astergoldman   2년 전

백트래킹 활용하면서 만들어보고 있습니다. 정답 갯수 찍기 이전에 n-queens 좌표들을 먼저 찍으려 하는데 의도와 다르게 나옵니다. 

result 에 결과들을 담으려하고 row를 끝까지 검색할 때만 result에 append 하는데 빈 배열만 리턴되어나옵니다.

코드 중간 검증용 print 문을 row == n 일때 찍어도

[[1, 3, 0, 2]]
[[2, 0, 3, 1], [2, 0, 3, 1]]

이렇게 나옵니다 원인이 뭘까요

alsrjs0725   2년 전

우선 25번째 줄 global result의 뜻은 밖에있는 global이라는 변수를 안에다 끌어 쓴다는 뜻이지 안에있는 변수를 밖에서 쓴다는 의미가 아닙니다. 또한 얕은복사가 일어나고 있으니 이에 관해서도 검색해보면 좋을듯합니다

astergoldman   2년 전

정말 대단히 감사합니다! global에 대한 의미를 잘 못해석하고 있었습니다. 그리고 말씀해주신 얕은 복사와 깊은 복사에 대해 다시 공부하면서 객체지향에 한 발자국 더 다가간 것 같습니다! 조언 덕택에 코드를 완성 시켰고 vsc 콘솔에서는 아주 성공적으로 결과를 도출했습니다 ㅎㅎ

조금 더 조언을 얻기 위해 글을 남기는데요, 콘솔에서는 제대로 나오는 반면 정답을 제출하게 되면 시간초과 이슈가 발생합니다. 혹시 시간을 단축시킬 방법이 있을까요?

alsrjs0725   2년 전

copy.deepcopy는 매우 느립니다 리스트의 값 뿐만 아니라 속성까지 복사해서 그렇다고는 하는데 자세히는 몰라서 이에대해 설명드리기는 어려울것 같습니다

내용물만 복사해도 상관없고 더 빠르게 복사하고싶으시면 lista = listb[:]와같은 방식을 통하여 내용물을 복사하실 수 있습니다

+ 위에서 제가 global result의 뜻은 밖에있는 global이라는 변수를 안에다 끌어 쓴다고 말을 하였는데 global에 있는 result라는 변수를 안에다 끌어쓴다는걸 잘못썼네요 혹시 나중에 글보시는분들 햇갈리지 않으시길 바랍니다

아래 내용을 보시기 전에 이 문제의 의미는 가지치기를 최대한 하여서 시간안에 코드가 통과하도록 하는게 목표인 문제이므로 이왕이면 혼자 풀어보시다가 영 안되면 보시길 추천드립니다

sol_queen에서 매번 0부터 n-1까지 검사를 하면 너무 느립니다 이미 선택한 열까지 검사를 하게되면 체스판 하나당 n^2/2개 가량의 쓸모없는 검사를 하게되고 이로인한 연산은 체스판 하나당 n^3/2개가 됩니다 단순하게 보면 출력되는 정답의 수 *n^3/2개의 추가연산을 하는거죠

저같은경우는 이를 선택되지 않은 열 리스트(notcol)를 만들어 for col in range(0,n): 대신 for col in notcol: 과같은 방식을 사용하여 시간을 확 줄일 수 있습니다

이렇게만 하셔도 pypy를 통하시면 통과 가능할겁니다만 더 줄이고싶으시다면 같은 대각선상에 있는지 체크를 할때 bool타입으로 되어있는 리스트에 몇번째 대각선은 불가능한지를 표시하여 검사하는 방법을 이용해 시간복잡도를 O(1)로 만들수도 있습니다

astergoldman   2년 전

친절하게 답변해주셔서 정말 감사합니다. 코드 구현에만 신경쓰다보니 시간복잡도의 관점까지는 미처 생각하지 못했습니다. 도움을 주신 내용을 바탕으로 visited list 를 작성하여 시간을 줄일 수 있었습니다! 시간복잡도를 O(1)로 만드는 것은 상상도 못했는데 도움이 많이 됐습니다. 친절하게 알려주셔 감사합니다!

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