프로그래머스의 다리를 지나는 트럭(Lv2) 문제이다.
[ 문제풀이 ]
1) 본인은 트럭이 다리에 올라감과 동시에 다리에서 내려가는 시간을 저장해 주었다.
예를 들어서 1번 트럭이 1초에 다리에 올라가고, 다리의 길이가 5라면, 이 트럭은 6초에 다리에서 내려갈 것이다.
이렇게 트럭이 다리에 올라가는 순간, 다리에서 내려오는 시간을 알 수 있기 때문에 이 시간을 저장해 주었다.
그래서 만약, 현재 트럭이 다리의 무게를 초과해서 올라갈 수 없는 상황이라면, 현재의 시간을 "현재 다리에서 가장 앞에
있는 트럭이 내려가는 시간" 으로 바로 건너뛰어 주었다.
예를 들어서
다리의 길이 = 5 / 다리가 버틸 수 있는 무게 = 10kg / 1초에 10kg인 1번 트럭이 올라가 있는 상태 /
현재 시간은 2초 / 10kg인 2번 트럭이 올라가려는 상황
이라고 가정을 해보면, 여기서 2, 3, 4, 5초를 시간만 ++ 해줘도 되지만, 그럴 필요 없이, 2초라는 시간을 바로 6초로
바꿔주고 트럭을 바로 올려주었다. 이런식으로 구현을 하였다.
즉, 본인이 구현한 내용을 정리해보면 다음과 같다.
1. 현재 트럭이 다리에 올라갈 수 있다면 ? = 그대로 올려준다.
2. 올라갈 수 없다면 ? = 현재 다리위에 있는 트럭들 중, 가장 앞에 있는 트럭들 부터 순차적으로 다리에서 내려가는
시간으로 시간을 건너뛰어 주면서 현재 트럭이 올라갈 수 있는 시간이 될 때 까지 시간을 넘겨준다.
이렇게 구현을 해 주었는데, 예제 입력까지는 모두 맞았지만, 틀리는 경우가 발생하였다.
바로 이런 경우였다.
다리의 길이 = 1 / 다리가 버틸 수 있는 무게 = 10 kg /
트럭의 무게를 순서대로 나타내면 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } 이런 경우였다.
이 경우 시간별로 설명을 해보자면, 1초에 1번트럭이 올라가고 2초에 1번트럭이 내려오면서 2번트럭이 올라가고,
3초에 2번 트럭이 내려오면서 3번트럭이 올라가고..... 이런식으로 진행된다.
하지만 ! 본인이 위에서 말한대로만 구현을 하다보니, 5초에 5번 트럭이 올라가지 못하는 상황이 생겼다.
애초에, 5초에 5번 트럭이 올라갈 수 있는 상황임에도, 올라갈 수 없는 조건문에 걸려버리면서 계산이 꼬여버리는
경우가 발생해서, 위의 과정에서 한 단계를 더 추가해주었다.
1. 현재 시간에 다리에서 내려갈 트럭이 있으면, 트럭을 내려준다.
2. 현재 트럭이 다리에 올라갈 수 있으면 올려준다.
3. 그게 아니라면, 위에서 말한듯이 시간을 건너뛰는 과정을 진행해준다.
이렇게 총 3단계로 구현을 했더니 pass를 받을 수 있었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <string> #include <vector> using namespace std; int EndTime[10010]; int solution(int bridge_length, int weight, vector<int> truck_weights) { int Total = 0; int Time = 1; int Front = 0; int Idx = 0; for (int i = 0; i < truck_weights.size(); ) { int CS = truck_weights[i]; /* 1. 현재 시간에 다리에서 내려갈 트럭이 있으면, 트럭을 내려준다. */ for (int j = Front; j < i; j++) { if (EndTime[j] == Time) { Total = Total - truck_weights[j]; Front++; } } /* 2. 트럭이 올라갈 수 있는 경우 */ if (Total + CS <= weight) { Total = Total + CS; EndTime[i++] = Time + bridge_length; Time++; } /* 3. 트럭이 올라갈 수 없는 경우 = 시간을 건너뛴다. */ else { while (1) { if (Total + CS <= weight) break; Total = Total - truck_weights[Front]; Time = EndTime[Front++]; } Total = Total + CS; EndTime[i++] = Time + bridge_length; Time++; } } Time = EndTime[truck_weights.size() - 1]; return Time; } | cs |
'[ Programmers Code ] > # PG - Level2' 카테고리의 다른 글
[ 프로그래머스 더 맵게 (Lv2) ] (C++) (2) | 2020.02.14 |
---|---|
[ 프로그래머스 괄호 변환 (Lv2) ] (C++) (0) | 2020.02.13 |
[ 프로그래머스 가장 큰 수 (Lv2) ] (C++) (0) | 2020.02.10 |
[ 프로그래머스 카카오 프렌즈 컬러링북 (Lv2) ] (C++) (4) | 2020.02.10 |
[ 프로그래머스 주식가격 (Lv2) ] (C++) (0) | 2020.02.10 |