티스토리 뷰


[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
링크
«   2025/02   »
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
글 보관함