(C++) 백준 1092.배

2025. 1. 25. 15:06·Algorithm

백준 1092번 배(C++)


문제 설명:

  • 최대로 옮길 수 있는 무게가 제한되어있는 크레인이 주어지고 옮겨야 할 박스의 무게들이 주어진다.
    각 크레인은 동시에 박스를 하나씩 옮길 수 있고 모든 박스를 옮기는데에 걸리는 시간을 출력해야한다.
    모든 박스를 옮길 수 없는 경우 -1을 출력한다.

문제 풀이:

  • 각 크레인은 남겨진 박스들 중에 옮길 수 있는 가장 무거운 박스들을 선택해서 하나씩 선택하고 동시에 옮긴다.
    • 크레인과 박스를 벡터에 각각 저장하고 두 벡터를 내림차순 정렬한다.
      • 스택(stack)을 이용하여 옮기지 못하는 박스는 다시 우선적으로 옮기도록 한다.
  • 모든 박스를 옮길 수 없는 경우
    • 가장 힘이 센 크레인이 옮길 수 없는 박스가 존재하는 경우.

코드

#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
#define FOR(i,N) for(int i=1; i<=N; i++)
int N,M;
vector<int> cranes;
vector<int> boxes;
int ans=0;
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N;
    FOR(i,N) {
        int x; cin >> x;
        cranes.push_back(x);
    }
    cin >> M;
    FOR(i,M) {
        int x; cin >> x;
        boxes.push_back(x);
    }
    sort(cranes.rbegin(), cranes.rend());
    sort(boxes.begin(), boxes.end());
    if(*prev(boxes.end())>cranes[0]) {
        cout << -1 << '\n';
        return 0;
    }
    stack<int> extraBoxes;
    stack<int> priorBoxes;
    for(auto& box: boxes) extraBoxes.push(box);
    while(!extraBoxes.empty()) {
        for(auto& crane: cranes) {
            while(!extraBoxes.empty() && extraBoxes.top() > crane) {
                priorBoxes.push(extraBoxes.top());
                extraBoxes.pop();
            }
            if(!extraBoxes.empty())extraBoxes.pop();
        }
        while(!priorBoxes.empty()) {
            extraBoxes.push(priorBoxes.top());
            priorBoxes.pop();
        }
        ans++;
    }
    cout << ans << '\n';
    return 0;
}

'Algorithm' 카테고리의 다른 글

(C++) BOJ 백준 1005번 ACM Craft / 위상 정렬(Topology Sort)  (0) 2025.03.21
(C++) BOJ 백준 10942번 펠린드롬?  (0) 2025.03.17
(C++) 백준 1992.쿼드트리  (0) 2025.02.18
(C++) 백준 15591. MooTube  (0) 2025.01.26
(C++) 백준 1068.트리  (0) 2025.01.25
'Algorithm' 카테고리의 다른 글
  • (C++) BOJ 백준 10942번 펠린드롬?
  • (C++) 백준 1992.쿼드트리
  • (C++) 백준 15591. MooTube
  • (C++) 백준 1068.트리
devStudent
devStudent
저의 개발(Development) 공부(Study) 기록을 추적(Tracing) 하는 블로그입니다!
  • devStudent
    Dev_Study_Trace
    devStudent
  • 전체
    오늘
    어제
    • 분류 전체보기 (23)
      • BackEnd (11)
      • DevOps (4)
      • Algorithm (7)
      • DDD 12기 (Server) (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    GitHub Actions
    yml
    데브 옵스
    도커
    알고리즘
    http 상태코드
    분할 정복 알고리즘
    쿠버네티스
    백준
    docker
    백준 1068번
    백준 1092
    boj1068
    NGINX
    boj 1992
    리버스 프록시
    Divide and conquer
    프록시 실습
    devops
    boj
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
devStudent
(C++) 백준 1092.배
상단으로

티스토리툴바