[C++] 백준 12739번: 돌림판 (Small)

be_clever·2022년 1월 19일
0

Baekjoon Online Judge

목록 보기
37/172

문제 링크

12739번: 돌림판 (Small)

문제 요약

N등분 되어 있는 돌림판이 있고, R, G, B 세 가지 색깔로 돌림판이 칠해져 있다. 주어진 조건에 따라서 돌림판의 색깔을 K번 바꾼다. 이때 마지막 상태의 돌림판의 각 색깔의 수를 출력해야 한다.
조건은 다음과 같다.
1. 만약 P의 왼쪽 부분과 P의 오른쪽 부분과 P에 칠해진 색이 모두 같거나, 모두 다르다면, P에 칠해진 색을 파란색으로 바꾼다.
2. 그렇지 않다면, 1에서 고려했던 세 부분 중에서 X 색이 2개, Y 색이 1개 칠해진 상황일 것이다.
3. 다음 조건을 한 가지라도 만족한다면, P에 칠해진 색을 빨강색으로 바꾼다. 그렇지 않다면, 초록색으로 바꾼다. (X가 빨강색이고 Y가 초록색인 경우, X가 초록색이고 Y가 파랑색인 경우, X가 파랑색이고 Y가 빨강색인 경우)

접근 방법

돌림판 문제인것을 보고 덱을 통해서 이동하면서 처리할까 생각해봤지만, (돌림판의 각 부분의 색은 동시에 바뀐다)라는 조건이 문제에 있었습니다. 따라서 문자열을 복사하면서 처리하였습니다.

정말로 단순한 구현 문제이기 때문에 추가적인 접근 방법은 없습니다. 구현에 있어서는 인덱스를 넘어가는 부분만 잘 처리해주면 됩니다.

코드

#include <bits/stdc++.h>

using namespace std;

struct RGB {
	int r = 0, g = 0, b = 0;
};

string str;

int f(int idx)
{
	if (idx <= -1)
		return str.size() + idx;
	if (idx >= str.size())
		return idx % str.size();
	return idx;
}

void func(RGB& rgb, char c)
{
	switch (c)
	{
	case 'R':
		rgb.r++;
		break;
	case 'G':
		rgb.g++;
		break;
	case 'B':
		rgb.b++;
		break;
	}
}

int main(void)
{
	int n, k;
	cin >> n >> k >> str;

	while (k--)
	{
		string tmp;

		for (int i = 0; i < str.size(); i++)
		{
			if ((str[f(i - 1)] == str[i] && str[i] == str[f(i + 1)])
				|| (str[f(i - 1)] != str[i] && str[i] != str[f(i + 1)] && str[f(i - 1)] != str[f(i + 1)]))
				tmp.push_back('B');
			else
			{
				RGB rgb;
				for (int j = -1; j <= 1; j++)
					func(rgb, str[f(i + j)]);

				if ((rgb.r == 2 && rgb.g == 1) || (rgb.g == 2 && rgb.b == 1) || (rgb.b == 2 && rgb.r == 1))
					tmp.push_back('R');
				else
					tmp.push_back('G');
			}
		}

		str = tmp;
	}

	RGB rgb;
	for (auto& i : str)
		func(rgb, i);

	cout << rgb.r << ' ' << rgb.g << ' ' << rgb.b;
	return 0;
}
profile
똑똑해지고 싶어요

0개의 댓글