#include <string>
#include <vector>
#include<iostream>
#include<queue>
using namespace std;
struct customTru{
int weight;
int time;
};
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int answer = 0;
int totalWeight=0;
int j=0;
vector<customTru> bridge;
vector<int>arrive;
static int count=truck_weights.size();
// queue<int> bridge;
while( truck_weights.size()>0||bridge.size()>0){
answer++;
//다리위 진행 시간
for(int k=0;k<bridge.size();k++){
(bridge.begin()+k)->time=(bridge.begin()+k)->time+1;
// cout<<"outputTime:";//<<//outputTime<<endl; //각각의 다리위의 트럭의 시간
}
//길이
if(!bridge.empty()){
if(bridge.begin()->time>bridge_length){ //첫번째 트럭이 다리의 길이를 걷넛을때
totalWeight= totalWeight-bridge.begin()->weight; //첫번째 트럭 무게 제거
// bridge.pop(); //다리에서 제거
arrive.push_back(bridge.begin()->weight);
bridge.erase(bridge.begin());
}
}
//무게
if(!truck_weights.empty()){
if(totalWeight+truck_weights[0]<=weight){
customTru tmp;
tmp.weight= truck_weights[0]; //현재 트럭
tmp.time=1;//들어온트럭 시간
bridge.push_back(tmp); //다리위
truck_weights.erase(truck_weights.begin());//truck_weights bridge로 넘어감
totalWeight=totalWeight+ (bridge.back()).weight;//현재 다리의 총무게
}
}
}
return answer;
}
200819
#include <string>
#include <vector>
#include<iostream>
#include<queue>
using namespace std;
struct BridgeOnTruckWeightLength{
int weight;
int length;
};
vector<BridgeOnTruckWeightLength>bridgeOnTruck;
int bridgeNowWeight=0;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int answer = 0;
while(truck_weights.size()>0||bridgeOnTruck.size()>0){
/*
cout<<"answer:"<<answer;
cout<<endl;
cout<<"truck_weights:";
for(int i=0;i<truck_weights.size();i++){
cout<<truck_weights[i]<<",";
}
cout<<endl;
cout<<"bridgeNowWeight:"<<bridgeNowWeight<<",";
cout<<endl;*/
//bridgeNowWeight=0;
for(int i=0;i<bridgeOnTruck.size();i++){
bridgeOnTruck[i].length+=1;//현재 존재하는 트럭들 이동
}
for(int i=0;i<bridgeOnTruck.size();i++){
if(bridgeOnTruck[i].length>=bridge_length){
bridgeNowWeight-=bridgeOnTruck[i].weight;
bridgeOnTruck.erase(bridgeOnTruck.begin()+i);//거리에 도달시 pop
}
}
//들어올 트럭과 이전 트럭 무게의 다리위 무게 체크
if(bridgeNowWeight+truck_weights[0]<=weight&&truck_weights.size()>0){
BridgeOnTruckWeightLength tmpData;
tmpData.weight=truck_weights[0];
tmpData.length=0;
//다리위 에 트럭 무게
bridgeNowWeight+=truck_weights[0];
bridgeOnTruck.push_back(tmpData);//트럭 다리위로 출발
truck_weights.erase(truck_weights.begin());//출발햇으니 시작점에서 제거
}
answer++;
}
//다리를 완전히 지남
return answer;
}
지난번엔 상당히 시간많이 잡아먹엇는데 생각보다 쉽게 풀엇다
이부분떄문에
정답이 안되는 코드인데 보면 길이가 도달해서 트럭이 나가면서 bridgeOnTruck 사이즈가 줄어들면서 for문이 최종 2번돌아야는게 1번만 돌고 끝이난다.
for(int i=0;i<bridgeOnTruck.size();i++){
bridgeOnTruck[i].length+=1;//현재 존재하는 트럭들 이동
if(bridgeOnTruck[i].length>=bridge_length){
bridgeNowWeight-=bridgeOnTruck[i].weight;
bridgeOnTruck.erase(bridgeOnTruck.begin()+i);//거리에 도달시 pop
}
}
이를 해결을 위해서 길이를 먼저 더해서 계산해주고
이제 다리를 지난 트럭들을 뺴주는 식으로 가야한다.
for(int i=0;i<bridgeOnTruck.size();i++){
bridgeOnTruck[i].length+=1;//현재 존재하는 트럭들 이동
}
for(int i=0;i<bridgeOnTruck.size();i++){
if(bridgeOnTruck[i].length>=bridge_length){
bridgeNowWeight-=bridgeOnTruck[i].weight;
bridgeOnTruck.erase(bridgeOnTruck.begin()+i);//거리에 도달시 pop
}
}
201007
이번에 dequpe를 이용해서 풀어보았다
다리위가 즉 들어올땐 push_back 나갈때 pop_front를 이용하였으며
while문 돌릴때 truch_weights 값이 전부다 빠지면truch_weights[0] 를 사용이 불가하니 이때 꼭 체크를하자 truch_weights.size()>0이상체크를해주자
#include <string>
#include <vector>
#include<iostream>
#include<deque>
using namespace std;
struct truckState{
int weight;
int length;
};
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int answer = 0;
int bridgeWeightLimit=weight;
int bridgeWeightNowState=0;
int count=0;
deque<truckState> bridge_state; //다리 현재 상태
for(int i=0;i<truck_weights.size();i++){
// cout<<truck_weights[i];
}
while(truck_weights.size()>0||bridge_state.size()>0){
answer++;
if(truck_weights.size()>0){
if(bridgeWeightNowState+truck_weights[0]<=bridgeWeightLimit){
bridgeWeightNowState=bridgeWeightNowState+truck_weights[0]; //들어오는 트럭
truckState tmpState;
tmpState.weight=truck_weights[0];
tmpState.length=1;
// cout<<truck_weights[1]<<",";
// cout<<truck_weights[0]<<",";
bridge_state.push_back(tmpState);
truck_weights.erase(truck_weights.begin());
// count++;
}
}
if(bridge_state.size()>0){
if(bridge_state[0].length<=bridge_length){
for(int i=0;i<bridge_state.size();i++){
bridge_state[i].length+=1;
// cout<< bridge_state[i].weight<<",";
// cout<< bridge_state[i].length<<",";
}
// cout<<":";
// cout<<answer;
// cout<<endl;
}
if(bridge_state[0].length>bridge_length){
bridgeWeightNowState-=bridge_state[0].weight;
bridge_state.pop_front();
}
}
}
answer++;
return answer;
}
bCheck는 문자열 검사하는 bool이다 즉 true면 confim++(압축된 갯수) 이고 아니면 false로 반환된다.
즉 한글자씩이면 true false만 가능하지만 만약 세글자면 true,true ,false면 이미 이 세글자의 비교에선 틀린거여서 더이상 for문이 돌지 않고 같지않는 단어로 판단한다.
더이상 같지 않는단어와 이미 압축된 갯수가 1이상이면 strm+=to_string(confirm); 숫자를 먼저 string 변환하여 넣어준다
for문은 글자의 크기이다 즉 세글자면 세번 네글자면 네번이 for문으로 돈다
bool bCheck=false;
for(int j=0;j<c.size();j++){
if(c[j]==str[j]){
bCheck=true;
}else{
bCheck=false;
break;
}
}
if(bCheck){
confirm++;
}else if(!bCheck){
if(confirm!=1){
strm+=to_string(confirm);
}
tmpCounts=tmpCounts-c.size(); //현재 나눠준 범위가 넘어갔는지 체크
//ex) 10을 3으로 나누면 1개가 남아서 한번더 3으로 나눌때
// 333 +1 인데 여기서 c size 는 문자열과 관계없이 쓰레기값이 들어감
//그래서 3 3 3 3으로 들어가 마지막 2자리가 쓰레기값이 들어감
// 이걸 없애기 위해 전체 길이를 구해서 c가 카운팅 될때 제거해서 음수값이
// 나오면 범위가 넘어간거여서 strm 값 입력시 3 3 3 1 이 들어가도록 +ns값을 넣어준다
// cout<<endl;
//cout<<"c.size()"<<c.size()<<",";
cout<<"tmpCounts"<<tmpCounts<<",";
int ns=0;
if(tmpCounts<0){
ns=tmpCounts;
}
그다음 divide 함수 맨 위에 static int tmpCount=s.length(); 가 있는데
tmpCounts=tmpCounts-c.size();
해준 이유가 글자수 때문이다 예를들어 10글자를 3글자씩 나눠서 압축할때
3 + 3+ 3+1 하고 한글자가 부족하다 이때 문자열은 관계없이 쓰레기 값이 들어가서
이를 방지하기위해서 tmpCounts 미리 문자열을 받아서 현재 10 -3 =7 다음 7-3=4 다음 4-3=1 다음 1-3=-2
이런식으로 음수를 측정합니다.
음수가 나왓으면 문자열을 초과한거로 인지합니다.
초과한 ns에 음수 -2를 넣어줍니다.
원래의tmpCounts양수면 ns는 0입니다.
if(tmpCounts<0){
ns=tmpCounts;
}
넣어주 c.size()는 현재 비교 문자 갯수 confirm 압축 갯수입니다. ns는 글자 초과시 현재 길이를 뺴줍니다.
예를들어 1글자 비교만하면되는 3 + 3+ 3+1 맨마지막c.size()는3이고
두글자가 쓰레기값 즉 ex)a, 쓰레기 값 , 쓰레기값 confim 은 당연히 1이고요 그럼 3-2(ns) 1만 나오게 됩니다.
그리고 최종 string strm에 입력 해줍니다.
confim 다시 1로 초기화 str,c도 초기화해줍니다. tmpCounts도 초기화 strm을 길이를 리턴합니다.
for(int j=0;j<c.size()/confirm+ns;j++){ // confirm비교데이터의 중복데이터를 제거 하기위해
//confirm 즉 현재 나눠지는 갯수로 나눠서
//넣어줌 현재 c는 비교 데이터를 가지고 잇어서 중복데이터가 잇음
strm+=c[j];
// tmpCounts++;
//cout<<c[j];
}
// cout<<",";
confirm=1;
str.clear();//비교 원본 끝난 pop
c.clear();//비교 끝난 pop
}
tmpCounts=s.length();
return strm.length();