본문 바로가기
algorithm/ACMICPC

원판 돌리기 - 17822

by 에어컨조아 2020. 1. 24.

문제 : https://www.acmicpc.net/problem/17822

코드 : 

#include <iostream>
#include <vector>
#include <set>
using namespace std;

int N, M, T;
vector<int> temp[50];
set<std::pair<int, int>> index_t;
int mv[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
vector<std::pair<int, int>> valueInIndex;

void solution(int x, int d, int k)
{
	//회전 횟수
	for (int i = 0; i < k; i++)
	{
		int mul = 1;
		while (true)
		{
			int n = x * mul;
			if (n > N)
				break;
			//시계방향
			if (d == 0)
			{
				int index = n - 1;
				int t = temp[index][M - 1];
				temp[index].pop_back();
				temp[index].insert(temp[index].begin(), t);
			}
			else
			{
				int index = n - 1;
				int t = temp[index].front();
				temp[index].erase(temp[index].begin());
				temp[index].push_back(t);
			}
			mul++;
		}
	}
	float total = 0;
	float count = 0;
	index_t.clear();
	valueInIndex.clear();
	//인접 값 처리
	for (int j = 0; j < N; j++)
	{
		for (int m = 0; m < M; m++)
		{
			for (int k = 0; k < 4; k++)
			{
				int my = j + mv[k][0];
				int mx = m + mv[k][1];
				if (my < 0 || my >= N)
					continue;
				if (mx < 0)
					mx = M - 1;
				if (mx >= M)
					mx = 0;
				if (temp[j][m] != 0 && temp[j][m] == temp[my][mx])
				{
					index_t.insert(std::pair<int, int>(j, m));
					index_t.insert(std::pair<int, int>(my, mx));
				}
			}
			total += temp[j][m];
			if (temp[j][m] != 0)
			{
				valueInIndex.push_back(std::pair<int, int>(j, m));
				count++;
			}
		}
	}
	//인접한 값이 없을 경우 평균값 처리
	if (index_t.empty())
	{
		float v = total / count;
		for (vector<std::pair<int, int>>::iterator iter = valueInIndex.begin(); iter != valueInIndex.end(); iter++)
		{
			if (temp[iter->first][iter->second] > v)
			{
				temp[iter->first][iter->second] -= 1;
			}
			else if (temp[iter->first][iter->second] < v)
			{
				temp[iter->first][iter->second] += 1;
			}
		}
	}
	else
	{
		for (set<std::pair<int, int>>::iterator iter = index_t.begin(); iter != index_t.end(); iter++)
		{
			temp[iter->first][iter->second] = 0;
		}
	}
}
int main()
{
	cin >> N >> M >> T;

	int v;
	//값 입력
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			cin >> v;
			temp[i].push_back(v);
		}
	}
	//케이스별 계산
	int x, d, k;
	for (int i = 0; i < T; i++)
	{
		cin >> x >> d >> k;
		solution(x, d, k);
	}
	//전체 합 계산
	int result = 0;
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			result += temp[i][j];
		}
	}

	cout << result << "\n";
	return 0;
}

 

평균값 처리할때 값이 같을경우가 else문으로 들어오는 버그가 있었음...

부호 처리할땐 주의하자...ㅠㅠ

'algorithm > ACMICPC' 카테고리의 다른 글

주사위 윷놀이 - 17825  (0) 2020.01.31
로봇 청소기 - 14503  (0) 2019.12.25
연구소 - 14502  (0) 2019.12.25
N-Queen - 9663  (0) 2019.12.23
테트로미노 - 14500 (Solve 2)  (0) 2019.12.14

댓글