Clolent

아주 단순하게 생각해서, 현재까지 송신은 했지만, 수신 시키지 못한 탑들을 Vector 로 유지, 관리하고

뒤에서부터 차례차례 앞으로 오면서 처리하면 최악의 경우 N 제곱이지만, 평균적으로는 N 제곱보다는 훨씬 빠르게 될것이다.

라고 기대하고 코딩을 시작하였다. 됬다면 해피엔딩 이었겠지만 N^2 은 타임 리밋 이었다.


#include <stdio.h>

#include <vector>


unsigned int height[5000001];

unsigned int result[5000001];


typedef std::pair<int, int> par;

std::vector<par> vec;

std::vector<par>::iterator chase;

// 높이 , 위치 - 1


int N;


void check(int height,int location);


int main() {

scanf("%d", &N);

int a;

for (a = 0; a < N; a++) {

scanf("%d", &height[a]);

}

vec.push_back(par(height[N - 1], N - 1));

for (a = N - 2; a >= 0; a--) {

check(height[a],a);

vec.push_back(par(height[a], a));

}


for (chase = vec.begin(); chase != vec.end(); chase++) {

result[chase->second] = 0;

}

for (a = 0; a < N; a++) {

printf("%d ", result[a]);

}

}


void check(int height, int location) {

for (chase = vec.begin(); chase != vec.end(); ) {

if (chase->first <= height) {

result[chase->second] = location+1;

chase = vec.erase(chase);

}

else

chase++;

}

}


타임 리밋이 걸리는 영 좋지 않은 코딩이었다....


생각을 뒤집어 보았다. 일단 기본적으로 입력을 쭉 받으면 여기서 이미 N 만큼의 시간을 소모하게 된다.

어차피 송신 수신이 일어나는 것은 자기자신과 그 앞에대해서 수행하는 것이다.

그렇다면 입력을 받으면서 처리를 할수 있을 것 같다. 라는 것까진 도달했다. 항상 여기까진 쉽게 도달하지


그런데 문제는 송신을하는 탑에서 가까운것부터 탐색을 해야하는데....이렇게 하면 또 N제곱인데 ? 

그리고 이번 스터디 하던 주제를생각했다. 스택과 큐 이번경우 가장 최근 들어온것 ( 송신탑에서 가까운것) 부터 하나하나

체크하는 것이므로 스택을 써야겠구나. 라는 생각이 들고는 무릎을 탁 쳤다. 스택을 STL로 하니 코드길이는 절반으로 속도는 더욱 빠르게 되서 아슬아슬하게 0.2 MS 차이로 통과하였다. 자랑스럽다


#include <stdio.h>

#include <vector>


unsigned int height[5000001];

unsigned int result[5000001];


typedef std::pair<int, int> par;

std::vector<par> vec;

std::vector<par>::iterator chase;

// 높이 , 위치 - 1


int N;


void check(int height,int location);


int main() {

scanf("%d", &N);

int a;

for (a = 0; a < N; a++) {

scanf("%d", &height[a]);

}

vec.push_back(par(height[N - 1], N - 1));

for (a = N - 2; a >= 0; a--) {

check(height[a],a);

vec.push_back(par(height[a], a));

}


for (chase = vec.begin(); chase != vec.end(); chase++) {

result[chase->second] = 0;

}

for (a = 0; a < N; a++) {

printf("%d ", result[a]);

}

}


void check(int height, int location) {

for (chase = vec.begin(); chase != vec.end(); ) {

if (chase->first <= height) {

result[chase->second] = location+1;

chase = vec.erase(chase);

}

else

chase++;

}

}

'Programing > C++ Algorithm' 카테고리의 다른 글

이진 탐색 ( Binary Search )  (0) 2016.07.03
Map ( 맵 ) 사용법 / STL  (0) 2016.06.29
Vector 사용법 / STL  (0) 2016.06.28
큐 구현 / 백준 10845 / Queue  (1) 2016.06.22
스택, 백준 10828번  (0) 2016.06.21
댓글 로드 중…

블로그 정보

Clolent - 커피물조절달인

최근에 게시된 글