티스토리 뷰
[BOJ 20055(S1) 리뷰]
오늘 푼 시뮬레이션 문제다.
설명은 위에 나온대로 친절하게 나와있다. 어떻게 구현을 할까 고민하던 중에 원형큐나 연결리스트를 사용하면 될 것같아 C++ STL에 존재하는 리스트를 사용해보기로 했다.
리스트를 사용해본적이 별로없어서 사용법을 익히느라 시간을 꽤 오래썼다. (그냥 연결리스트를 구현하는게 빨랐을듯)
시간은 오래걸렸지만 이 문제를 통해 반복자라는 개념에 대해서 조금 알게되었다.
난 이 문제를 해결하기 위해 리스트를 통해 입력을 받고 "올라가는 위치"와 "내려가는 위치"를 별도의 변수에 담았다.
그리고 벨트를 회전할 때 마다 이 값들을 바꿔주었다.
벨트를 회전하는것은 매우 간단하다. 리스트의 맨 끝에 있는 요소를 맨 앞에다 붙이고, 맨 끝에 있는 요소를 삭제하면 벨트 회전을 구현할 수 있다.
로봇이 한칸 씩 이동하는 것은 반복자를 통하여 반복문으로 구현했다. 내구도와 로봇이 있는지 체크하여 이동이 가능하다면 이동하도록 말이다. 이때 문제 설명이 좀 부실해서 (로봇이 내리는 시기가 정확히 언제인지 안나옴) 시간을 더 잡아먹었다. 결국 로봇이 내리는 시기는 '1.벨트를 회전했을때, 2.로봇이 이동했을때' 로봇이 내리는 위치에 있다면 내리면 된다.
그리고 또 한가지 실수했던것은 내구도가 0인 칸의 개수가 K개 이상일 경우 과정을 종료해야하는데 '==0' 이라는 조건식을 걸어 시간초과가 났다. 한번에 여러개의 발판의 내구도가 0이되는점을 고려하지 못했다. '>=0'으로 수정하니 정답처리 되었다.
/*
21.01.02
BOJ : 20055 컨베이어 벨트 위의 로봇 (https://www.acmicpc.net/problem/20055)
구현
*/
#include <bits/stdc++.h>
using namespace std;
int N, K;
list <pair<int,int>> belt;
list <pair<int, int>>::iterator up;
list <pair<int, int>>::iterator down;
void rotation() {
up--;
down--;
belt.push_front(belt.back());
belt.pop_back();
}
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
cin >> N >> K;
for (int i = 0; i < N; i++) {
int temp;
cin >> temp;
belt.push_back({temp,0});
}
down = belt.end();
down--;
for (int i = 0; i < N; i++) {
int temp;
cin >> temp;
belt.push_back({ temp,0 });
}
up = belt.end();
up--;
int cnt = 0;
int zeroCount = 0;
while (true) {
rotation();
auto iter = up;
auto prev = belt.begin();
if (down->second == 1) {
down->second = 0;
}
while (iter != belt.begin()) {
if (prev->first > 0 && prev->second == 0 &&iter ->second == 1) { //다음 칸으로 이동할 수 있는 경우
iter->second = 0;
prev->first -= 1;
prev->second = 1;
if (prev->first == 0) {
zeroCount++;
}
}
prev = iter;
iter--;
}
if (belt.begin()->first>0 && belt.begin()->second==0) {
belt.begin()->first -= 1;
belt.begin()->second = 1;
if (belt.begin()->first == 0)
zeroCount++;
}
if (down->second == 1) {
down->second = 0;
}
cnt++;
if (zeroCount >= K) {
cout << cnt;
return 0;
}
}
}
'알고리즘 풀이 > 시뮬레이션' 카테고리의 다른 글
BOJ : 19238 스타트 택시 (0) | 2021.01.08 |
---|---|
BOJ : 17837 새로운 게임 2 (0) | 2021.01.03 |
BOJ : 16235 나무 재테크 (0) | 2021.01.01 |
BOJ : 14890 경사로 (0) | 2020.12.30 |
BOJ : 14503 로봇 청소기 (0) | 2020.12.29 |
- Total
- Today
- Yesterday
- 중앙대학교
- 알고리즘
- 백준
- BFS
- 스레드
- nestjs
- 동적계획법
- dfs
- nodeJS
- nest.js
- 자바
- 투포인터
- 컴퓨터 통신
- 예외처리
- ReactNative
- java
- node.js
- 그래프
- boj
- Computer Architecture
- 시뮬레이션
- 재귀
- typeORM
- 세그먼트 트리
- 그리디
- 백트래킹
- 벨만포드
- 컴퓨터 구조
- 자바스크립트
- 구현
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |