먼저 역수열을 원래수열로 만들어봐야 한다
예제처럼 숫자의 개수가 8일때
5 3 4 0 2 1 1 0 를 원래 수열로 만들어 보면
먼저 1부터 N까지의 수를
한번씩만 사용해서 이루어진 수열이고
앞에 자기보다 큰수가 있으니까
1~8을 오름차순으로 나열해서 풀어야 한다
역수열
5 3 4 0 2 1 1 0
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
1 2 3 4 5 6 7 8
X X X X X X X X
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
1은 자신보다 큰 값이 다섯개 있다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
1 2 3 4 5 6 7 8
X X X X 1 X X X
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
2는 자신보다 큰 값이 세개 있다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
1 2 3 4 5 6 7 8
X X X 2 X 1 X X
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
3은 자신보다 큰 값이 네개 있다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
1 2 3 4 5 6 7 8
X X X 2 X 1 3 X
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
...
자신보다 작은 숫자는 상관없고
큰숫자들이 들어오니까 X의 개수만큼
인덱스0~7을 숫자 1~8이라고 생각하고
a[i]에는 자신이 몇번째인지가 들어있으니까
i를 1씩 감소시키다가 0이 됐을때
j에 값이 없는지 확인하고 넣으면 된다
자신의 자리를 찾는 i와 빈공간을 찾는 j
두가지 포문안에서
i가 자신의 자리를 찾았을때 0이 되므로
seq[j]가 0인경우 원래값인 i+1을 넣고
a[i]는 0이 아닌데 seq[j]가 0인경우
a[i]를 1 감소시킨다
꿈★은 이루어진다
내일채움공제 되는 중소기업 가자 화이팅!
니 풀이를 정확히 이해하진 않았는데 O(n)은 아니지? O(n)으로 풀 수 있을 거 같은데
이것도 너무 어렵게 풀었어요 ㅠㅠ 한번 올려주시면 감사히 보겠습니다...
걍 이중포문 엔제곱이에요
예시에 있는 걸로 설명을 하자면 처음 8에 해당하는 역수열의 값은 0 이니까 그대로 [8], 7은 1이니니까 8앞에서 한칸 뒤로 가서 [8 7], 6은 1이니까 8앞에서 1칸 뒤로가서 [8 6 7], 5는 2니까 2칸뒤로가서 [8 6 5 7], 마찬가지로 [4 8 6 5 7], [4 8 6 5 3 7], [4 8 6 2 5 3 7], [4 8 6 5 2 5 1 3 7]이 되서 원래의 수열이 나옴. python 이니까 insert쓰면 될거 같은데 이게 O(n)이라 이대로면 O(n^2)이고, linked list사용하면 O(n)이 되지 않을까? 이것도 접근은 해야하니까 포인터 table따로 만들어서 관리한다는 전제하에... python으로는 ps안해봐서 이정도가 한계임