ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ]백준 15804번: 저거 못 타면 지각이야!!
    Problem Solving/BOJ(백준) 2019. 4. 25. 00:45

    트럭문제는 정직하게 큐를 써서 풀었는데, 맞은 사람들을 보니까 굳이 안써도 풀 수 있구나 싶었다

    메모리 계산이나 시간 계산같은 것은 아직은 할 줄 모르지만.. 나는 극한의 효율충이기 때문에

    원리 자체는 큐이지만 했지만 배열로 풀었다

    항상 문제푸는 스킬?이 부족하다는 생각을 하는데 현재까지는 그냥 알고리즘을 생각하고 그걸 수도코드로 만들어서 코드화를 시키고 있다

    그래서

    //현재 정차되어 있는 버스들의 시간을 1씩 감소시킨다

    //정차할 수 있다면(빈자리가 있다면) 다음 버스를 정차시킨다

    크게 두 단계에서, 각각의 과정을 세분화해서 알고리즘을 코드로 구현한게 끝이다

    변수 cn = 현재 정차중인 버스 수

    ct = 현재 단위 시간

    fin = 정차를 마치고 빠져나간 버스 수

    index = 다음에 들어갈 버스의 번호

    fin~fin+cn까지가 현재 정류장에 있는 버스들의 번호이다

     

    #include <cstdio>
    struct bus {
    	int t, p, c;
    };
    int n, m, cn, ct, fin, index;
    bus b[101];
    int main() {
    	scanf("%d%d", &n, &m);
    	for (int i = 0; i < m; i++)scanf("%d%d", &b[i].t, &b[i].p);
    	while (index < m) { 
    		ct++;
    		for (int i = fin; i < fin + cn; i++) { 
                //현재 정차하고 있는 버스들의 타이머 감소
    			b[i].p--;
    			if (b[fin].p <=0 && b[i].p <= 0) { fin++; cn--; }
                //뒤에 버스들의 정차 시간이 끝나도 첫번째 정차중인 
                //버스의 타이머가 끝날때까지 대기 후 변수 조정
    		}
    		while (cn < n && ct >= b[index].t) {
                //버스 수가 최대 정차 수보다 작고 현재 시간이 다음 버스가 들어올 수 있으면
    			if (cn && b[fin + cn - 1].c == n)break;    
                //직전 버스가 정류소의 맨 끝에 있으면 못들감
    			if (!cn)	b[index].c = 1;  //정류소에 버스가 없으면 1번위치로
    			else b[index].c = b[fin + cn - 1].c + 1;
                //버스가 있다면 그 버스의 바로 뒤로
    			index++; cn++;
    		}
    	}
    	printf("%d", b[m - 1].c);
    	return 0;
    }
    
Designed by Tistory.