개발자 피터
Peter's Dev Blog
개발자 피터
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • 🧑🏻‍💻 Develop (13)
      • Devops (3)
      • Elasticsearch (3)
      • Design Pattern (1)
      • SQL (4)
      • Architecture (1)
      • APM (1)
    • 💻 Service (7)
      • E-ROOM (3)
      • Briefing (4)
    • 💡 Problem Solving (43)
      • Baekjoon (40)
      • Programmers (2)
    • 📚 Reading (12)
      • Tech (9)
      • Self-Help (3)
    • 💬 Etc (1)
    • 📈 Retrospective (1)

블로그 메뉴

  • 🌟 깃허브
  • 🏷️ 태그 클라우드
  • 📝 방명록

공지사항

인기 글

태그

  • SQL
  • 그리디
  • 구현
  • 백준
  • boj
  • 독서
  • briefing
  • 문자열
  • E-ROOM
  • 브루트포스
  • elasticsearch
  • Programmers
  • 백트래킹
  • java
  • MySQL

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자 피터

Peter's Dev Blog

💡 Problem Solving/Baekjoon

[백준 - 13335] 트럭 [C++]

2023. 10. 14. 02:02
728x90
반응형

1. 문제

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

 

2. 풀이

문제에 주어진대로 시뮬레이션하면 되는 문제이다.

1. 트럭을 다리에 진입시킬 수 있으면 진입시킨다.

2. 다리에서 트럭을 한 칸씩 이동시킨다.

 

1 - 2를 반복한 후, 오른쪽 땅에 남아있는 트럭이 없으면 다리의 트럭들을 왼쪽 땅으로 옮겨준다..

 

3. 코드

#include <iostream>
#include <vector>
#include <queue>

using namespace std;
// 13335
/*
    n : 트럭의 개수
    w : 다리의 길이
    L : 다리의 최대하중
*/
int n, w, L;
queue<int> trucks;
vector<int> bridge;
int ans = 1;


// 다리에 트럭을 진입시킬 수 있는지 판단하는 함수
bool isPossible(int x) {
    int total = 0;
    for(int i=0; i<w; i++) total += bridge[i];
    if(total + x > L) return false; // x를 다리에 두었을 때 L을 초과하면 안된다...
    return true;    
}   

// 다리에 트럭을 진입시키는 함수
void insert(int x) {
    bridge[w-1] = x;
}

// 다리에 존재하는 트럭을 단위 길이씩 이동시키는 함수
void move() {
    for(int i=1; i<w; i++) {
        bridge[i-1] = bridge[i];
    }
    bridge[w-1] = 0;
    ans++;
}

// 다리에 남아있는 트럭을 이동시키는 함수 (필요한 단위 시간을 추가해준다..)
void postMove() {
    int position = -1;
    for(int i=w-1; i>=0; i--) {
        if(bridge[i]) {
            position = i;
            break;
        }
    }

    if(position != -1) ans += (position + 1);
}

int main() {

    cin.tie(nullptr);
    ios::sync_with_stdio(false);

    cin >> n >> w >> L;
    bridge.resize(w);

    for(int i=0; i<n; i++) {
        int input;
        cin >> input; 
        trucks.push(input);
    }

    while(!trucks.empty()) {
        int truck = trucks.front();
        if(isPossible(truck)) {
            trucks.pop();
            insert(truck);        
        }
        move();
    }

    // 트럭을 다리에 다 넣었으면 다리에서 트럭이 다 탈출할때까지의 시간을 더해주어야 함.
    postMove();

    cout << ans;

    return 0;
}
728x90
반응형
저작자표시 (새창열림)

'💡 Problem Solving > Baekjoon' 카테고리의 다른 글

[백준 - 1541] 잃어버린 괄호 [C++]  (0) 2023.10.16
[백준 - 15829] Hashing [C++]  (0) 2023.10.14
[백준 - 20040] 사이클 게임 [C++]  (0) 2023.10.13
[백준 - 23247] Ten [C++]  (0) 2023.10.13
[백준 - 1780] 종이의 개수 [C++]  (0) 2021.03.15
    '💡 Problem Solving/Baekjoon' 카테고리의 다른 글
    • [백준 - 1541] 잃어버린 괄호 [C++]
    • [백준 - 15829] Hashing [C++]
    • [백준 - 20040] 사이클 게임 [C++]
    • [백준 - 23247] Ten [C++]
    개발자 피터
    개발자 피터
    Backend Engineer 🔥

    티스토리툴바