본문 바로가기

스터디

Deque 활용 문제 풀이

https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

 

솔루션


deque를 이용해서 해결이 가능하다.

 

먼저 deque에 1~N까지 숫자를 차례대로 push_back을 해 준다.

 

그리고K-1만큼 deque.front()에서 뽑아주고, deque.push_back()을 해 준다.

이를 deque가 빌 때 까지 반복한다.

 

 

코드


#include <iostream>
#include <deque>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	int N, K;

	cin >> N >> K;

	deque<int> dq;

	for (int i = 1; i <= N; i++) {
		dq.push_back(i);
	}
	
	K--;
	cout << "<";
	while (!dq.empty()) {
		for (int i = 0; i < K; i++) {
			dq.push_back(dq.front());
			dq.pop_front();
		}
		if (dq.size() == 1) {
			cout << dq.front() << ">";
		}
		else cout << dq.front() << ", ";
		dq.pop_front();
	}
}

 

 

 

 

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

 

솔루션


배열에 apple의 위치, 뱀의 위치를 저장하는 bool 배열을 통해 해결할 수 있었다.

 

입력으로 들어온 사과를 다 방문 처리를 해 주고,

그리고 방향전환을 하는 시간에 해당 방향을 준다.

 

 

그리고 시간 1씩 늘리면서, 앞으로 계속 나아갈 수 있는지 확인하고, 나아갈 수 있다면, deque의 front에 해당 좌표를 넣고, 방문 처리를 한다. 사과를 먹는다면 deque의 pop_back을 하지 않고

사과를 먹지 못했다면, deque.pop_back을 해 준다.

 

 

 

코드


#include <iostream>
#include <deque>
using namespace std;

int N, K, L;
bool apple[102][102];
bool visit[102][102];

int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
int dir = 0;

char str[10203];
deque<pair<int, int>> dq;

int cnt = 0;

bool check() {
	int tx = dq.front().first + dx[dir];
	int ty = dq.front().second + dy[dir];

	if (tx < 0 || ty < 0 || tx >= N || ty >= N) { //격자판을 벗어나면
		return false;
	}
	else if (visit[tx][ty]) { //자신의 몸이 있는 곳이라면,
		return false;
	}
	
	dq.push_front({ tx,ty });
	visit[tx][ty] = true;
	if (apple[tx][ty]) { //사과가 있다면,
		apple[tx][ty] = false;
	}
	else {
		visit[dq.back().first][dq.back().second] = false;
		dq.pop_back();
	}
	return true;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> N;
	cin >> K;

	for (int i = 0; i < K; i++) {
		int x, y;
		cin >> x >> y;
		apple[--x][--y] = true;
	}

	dq.push_back({ 0,0 });
	visit[0][0] = true;
	cin >> L;

	while (L--) {
		int idx;
		char c;
		cin >> idx >> c;

		str[idx] = c;
	}


	while (check()) {
		cnt++;
		if (str[cnt] == 'D') {
			dir++;
			dir %= 4;
		}
		else if (str[cnt] == 'L') {
			dir--;
			dir += 4;
			dir %= 4;
		}
	}

	cout << cnt + 1 << '\n';
}

'스터디' 카테고리의 다른 글

알고리즘 스터디 - 큐  (0) 2023.07.20
우선순위 큐  (0) 2023.07.04
[스터디] 연결리스트(Linked List)  (2) 2023.05.18
1-1 중복이 없는가?  (0) 2023.05.11