728x90
반응형
문제 출처 : https://www.acmicpc.net/problem/20055
풀이
이동하는 벨트에서 로봇 공정이 얼마나 진행될 수 있는지 판단하는 구현 문제이다.
처음 내구도, 로봇 여부를 pair vector로 받아 구현하였고 문제에서 제시된 단계대로 구현하였다.
1. 벨트 이동
deque등으로 직접 옮기는 방법도 있으나, idx를 옮기는 방식으로 구현하였다.
시계방향으로 벨트가 이동하므로 idx를 왼쪽으로 한칸 옮기면 된다.
여기서 주의할 점은 idx가 0에서 왼쪽으로 가면 2N-1이 되므로 모듈러 연산을 통해 구현해야 한다.
이렇게 idx이동을 통해 벨트를 한칸 이동시키고 내리는 위치도 유동적으로 구해준다.
upIdx = (upIdx + (N * 2) - 1) % (N * 2); // 벨트 이동
int downIdx = (upIdx + N - 1) % (N * 2); // 내리는 위치
2. 로봇이 내리는 조건
문제에서 상세하게 설명이 되어있지 않아 초반에 헷갈렸으나,
벨트 이동전 & 후 모두 내리는 위치에 있으면 바로 내려주면 된다.
코드
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int N, K;
cin >> N >> K;
vector<pair<int, bool>> v(N * 2, {0, false});
for(int i = 0; i < N * 2; i++)
cin >> v[i].first;
int upIdx = 0; // 올리는 위치
int ans = 1;
while(true){
upIdx = (upIdx + (N * 2) - 1) % (N * 2); // 벨트 이동
int downIdx = (upIdx + N - 1) % (N * 2); // 내리는 위치
if(v[downIdx].second)
v[downIdx].second = false; // 로봇있으면 내림
for(int i = upIdx + N - 1; i >= upIdx; i--){
int nowIdx = i % (N * 2); // i가 2N보다 클 수 있음
int nextIdx = (nowIdx + 1) % (N * 2);
if(v[nowIdx].second && (!v[nextIdx].second && v[nextIdx].first > 0)){
v[nowIdx].second = false;
v[nextIdx].first--;
v[nextIdx].second = true;
}
}
if(v[downIdx].second)
v[downIdx].second = false; // 로봇있으면 내림
// 새로운 로봇 올리기
if(v[upIdx].first > 0){
v[upIdx].first--;
v[upIdx].second = true;
}
// 내구도 0 카운트
int cnt = 0;
for(auto elem : v){
if(elem.first == 0)
cnt++;
}
if(cnt >= K) break;
ans++;
}
cout << ans << '\n';
return 0;
}
728x90
반응형
'Tech > Algorithm' 카테고리의 다른 글
[BOJ] 백준 1717 집합의 표현 c++ (유니온 파인드) (0) | 2023.01.14 |
---|---|
[BOJ] 백준 1092 배 c++ (그리디) (0) | 2023.01.12 |
[BOJ] 백준 1339 단어 수학 c++ (그리디) (0) | 2023.01.10 |
[BOJ] 백준 1806 부분합 c++ (투포인터) (0) | 2023.01.09 |
[BOJ] 백준 1027 고층건물 c++ (브루트포스, 기하학) (0) | 2023.01.04 |