kwak2418   3년 전

어떤 컨셉으로 풀어나가야 할지 잘 모르겠습니다...

set도 이용해보고 map도 이용해보고 해봤는데 결국.. 마지막은 이중 반복문으로 비교를 할 수 밖에 없더라구요.. 모두 시간초과가 나왔습니다.. 

nomatter2k   3년 전

정답인지는 모르겠는데, 저는 binary tree를 이용했습니다.

kwak2418   3년 전

감사합니다 참고 하겠습니다 

seng1127   3년 전

이 코드에서는

vector v; //정렬 및 중복값 제거를 위한 벡터
vector v1; //입력값을 기억할 벡터

v에서 값을 하나 읽고 그걸 토대로 v1을 처음부터 끝까지 흝으면서 값이 같은 좌표를 압축된 좌표로 바꿔주는 방법을 사용하고 있는데요.

v1을 처음부터 끝까지 흝으면서 값이 같은지 검사하고 바꾸는 방법은 느립니다. 그래서 시간초과가 나옵니다.


반대로 생각해서, v1에서 값을 하나 읽고 그걸 토대로 v를 처음부터 끝까지 흝으면서 값이 같은것을 찾아 좌표를 바꿔주는 방법을 사용하면 어떻게 될까요?

앞의 방법과 똑같은 시간에 똑같이 느리겠죠. 하지만 v는 v1과 다르게 정렬이 되있습니다. 정렬이 되있는 데이터는 값을 찾기위해 처음부터 끝까지 흝을 필요가 없습니다.

이진탐색이라는 방법을 사용해서 값을 빠르게 찾을 수 있죠.

즉, 정렬된 데이터는 이진탐색을 통해서 값을 빠르게 찾을 수 있으므로 v1에서 값을 하나 읽고 그걸 토대로 v에서 같은 값을 찾아서 좌표를 바꿔주는 방법이 훨씬 빠릅니다.

(이진탐색은 c++ algorithm헤더에서 lower_bound 메서드를 사용하면 됩니다.)

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