안녕하세요! 테크지니어22입니다.
오늘은 백준 알고리즘 13335번 - 트럭을 풀어보도록 하겠습니다.
https://www.acmicpc.net/problem/13335
13335번: 트럭
입력 데이터는 표준입력을 사용한다. 입력은 두 줄로 이루어진다. 입력의 첫 번째 줄에는 세 개의 정수 n (1 ≤ n ≤ 1,000) , w (1 ≤ w ≤ 100) and L (10 ≤ L ≤ 1,000)이 주어지는데, n은 다리를 건너는 트
www.acmicpc.net
[문제 접근]
가장 오래걸리는 시간을 확인해보았을 때 n * w+로 100,001라는 것을 확인할 수 있습니다.
제한시간은 1초로 넉넉해서 완전탐색으로 접근했습니다. 그리고 가장 먼저 다리에 통과한 트럭이, 가장 먼저 빠져나오기 때문에 큐를 이용하였습니다.
[풀이 전략]
1. for문 w*n+1만큼 돈다.
2. 현재 입구에 ㅣ대기중인 트럭을 가리키는 pt 변수, 다리 위에 올라와 있는 트럭을 저장할 q, 다리위의 총 무게 currL을 생성합니다.
3-1) pt가 n이 아닌 경우
- 만약 currL과 arr[pt]의 합이 L이하라면 -> q에 arr[pt]를 대입하고, currL에 arr[pt]를 더하고 pt 증가시킵니다.
- 만약 currL과 arr[pt]의 합이 L을 초과하면 -> 0을 q에 삽입합니다.(여기서 0은 정지역할)
3-2) pt가 n인 경우
- -1을 삽입합니다. (여기서 -1은 종료역할)
4. q의 크기가 w와 같으면 q를 하나 꺼내는데 -1이면 tot = i로 초기화하고 break를 합니다. 만약 꺼낸 것이 0이 아니라면 currL에 그것을 빼줍니다.
5. tot이 값이 0이라면 최악의 상황임을 의미하므로 w*n+1을 대입합니다.
6. tot을 출력합니다.
[코드]
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
// 트럭
int n, w, l ;
int arr[1'001];
int tot ;
int pt ;
int currL;
queue<int> q ;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> w >> l ;
for(int i = 0 ; i < n ; i++) cin >> arr[i];
for(int i= 0 ; i < w*n+1 ; i++){
if(q.size() == w) {
int cur = q.front(); q.pop();
if(cur == -1){tot = i ;break ;}
if(cur != 0 ) currL -= cur;
}
if(pt != n){
int nxt = arr[pt];
if((currL + nxt) <= l){ q.push(nxt); currL += nxt; pt++; }
else {q.push(0);}
}
else{
q.push(-1);
}
}
if(tot == 0) tot = w*n+1 ;
cout << tot;
}
[배울 점]
- 경계지점을 명확히 하고 문제풀이에 들어가기
'알고리즘 > 백준' 카테고리의 다른 글
[백준/C++] 알고리즘 2531번 - 회전 초밥 (0) | 2024.04.09 |
---|---|
[백준/C++] 알고리즘 1405번 - 로봇 청소기 (0) | 2024.04.08 |
[백준/C++] 알고리즘 2805번 - 나무 자르기 (0) | 2024.04.06 |
[백준/C++] 알고리즘 18869번 - 멀티버스 II (0) | 2024.04.06 |
[백준/C++] 알고리즘 2467번 - 용액 (2) | 2024.04.06 |