삼촌아 니 달팽이 코드는 O(1)이 아니라 O(n*n)이다.
어떻게 O(1)라고 생각하는지 모르겠으나
니 코드는 N*N 각각의 원소에 개별적으로 inline으로 값을 assign하고 있다.
(경우에 따라 최적화 되어 개별 assign이 아니라 메모리 복사가 이뤄질 수 있다.
x86-64 g++ 7.3.0에서, int 배열이면 메모리 복사, long long 배열이면 immediate 데이타의 개별 assign(즉mov instruction) )
니가 이해를 못할거 같아 더 쉽게 설명하면 A[i][j]=value assign문이 N*N개 있는 코드가 발생되는 것이다.
(또는 메모리 복사; 이 복사도 simd 레지스터 크기에 맞춰 복사 코드가 반복된다, 일반 immediate 데이타의 mov 반복 처럼; 단 반복 횟수가 N*N보다 줄어듦)
runtime에 값을 결정하는 보통의 달팽이 프로그램들은 보통 loop를 통해서 니 코드보다 더 효율적으로 assign하지.
loop로 하나, 너처럼 일일이 N*N개의 assign문으로 구성하나 시간복잡도는 똑같이 O(N*N)이다.
다만 loop방식은 공간 복잡도가 N과 무관하게 O(1)인데
니 코드는 공간 복잡도도 O(N*N)이다. N이 커지면 무식하게 코드가 커지는 거지.
니코드는 snail<N...>() 함수 뿐 아니라 print<N...>()함수도 시간/공간 복잡도 모두 O(N*N)이다.
cout << matrix[i][j] 를 N*N개 inline으로 발생시키는 무식한 코드다.
한미디로 기본도 모르는 무식한 코드가 되겠다.
그냥 단순하게 생각해도, stack 변수 matrix의 RUNTIME 주소나 참조를 어떤 함수에 인자로 넘겨서, <RUNTIME>에 N*N개의 값을 채우는 O(1)의 방법이 있겠냐?
O도가 뭔지 모르면 위키라도 찾아 봐라. O(1)이 뭔지는 아나? C++도 그렇고.
(니가 걸은 sort()를 자랑하는 링크 타고 가서 봤는데 TSTL인가에 있는 sort()도 기본이 없는 엉망으로 짜놨더만. 왜 엉망인지 갈쳐줘? 그리고 STL에 있는 소스 베끼지도 못하나?)
compile time에 계산해서, run time assign없이, 결과적인 달팽이 배열을 얻도록 함수를 만들 수가 있는데(배열 초기화를 이용),
설사 이 경우도 그 배열의 stack 변수에의 복사나, 초기화된 static 변수 메모리 적재 시간은 O(N*N)이다.
굳이 글을 쓰기 귀찮은데, 저번에 니가 쓴 자랑글에 O(1)이 아니라고 누가 가르쳐 줬는데도, 그 본글은 삭제하고 계속 아래 링크에서 처럼, 기본도 모르면서 사기를 치고 있으니 자세하게 설명한거다. 그사람은 자세히 가르쳐 주지도 않았는데 그래도 나는 자세히 가르쳐 줬으니 감사하도록.
아래:
http://gall.dcinside.com/board/view/?id=programming&no=839701&page=2
https://gist.github.com/samchon/e76ced99bc908aca7d8ae87b6fe4b9a0
추가설명: 위 공간복잡도는 데이타 배열이 아닌 실행 코드의 공간복잡도임
글쓴이의 말이 100% 다 맞는거 같습니다. 기본도 몰라 죄송합니다 ㅠㅠ
메타 프로그래밍으로 컴파일 타임에 계산을 다 시켜버리면, 런타임 코드에 루프문 자체가 없어지기에 O(1) 이라 생각했는데, 이 글을 읽어보니 글쓴이 말이 맞는듯 ㅠㅠ
헐... 저번에 내가 갈쳐줬었는데 글삭튀 했었나보네? 코드도 개판이라 팀원 저렇게 짜면 당장 키보드 날릴 듯.