osh1795   2년 전

풀어서 맞추기는 했는데 너무 무식하게 노가다로 구한거 같아서 질문합니다

먼저, 제가 소스 코드를 작성한 과정입니다.

우선 1~9999까지 for문을 이용해서 리스트에 넣은 다음 1~9999까지 모든 숫자의 d()를 구했습니다.

그 후 d()를 리스트에서 하나하나 제거해주는 방식으로 셀프 넘버를 구했습니다.

근데 막상 하고보니 효율적(?)이지 못하고 너무 노가다인거 같아서 여기서 불필요한 과정이 있거나, 저처럼 1~9999의 리스트에서 지워가는 방식이 아닌 다른 방식이 있는지 질문합니다.

dps2   2년 전

그렇게 노가다인 편은 아닙니다.

다만 8번째,9번째 줄에 if d in case와 remove가 비효율 적입니다.

왜냐하면 python에서 list자료형에 in을 쓰게되면 모든 원소를 하나하나 보면서 있는지 확인하고

삭제할 때도 해당 원소를 삭제하고 자리를 하나씩 당겨야하므로

예를 들어

1 2 3 4 5 에서 3을 제거하는 방법을 보여드리면

1 2 3 4 5 => 1 2 4 4 5 (4를 원래 3위치에 덮어씀) => 1 2 4 5 5 (5를 원래 4위치에 덮어씀) => 1 2 4 5 (길이를 4개로 줄임)

이렇게 되어서 비효율적입니다.

따라서 list에 True False를 저장하고 remove대신 해당 원소를 True나 False로 바꾸는 편이 나을 것 같습니다(True일지 False일지는 정의하시기 나름입니다.)

참고하실 수 있게 코드 첨부합니다.

i+sum([..이 부분을 함수로 나타내는게 더 깔끔할 거 같은데 함수를 잘 안쓰시는 편이신거 같아 하나로 합쳤습니다.

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