백준 20365번 - 블로그2
문제 풀이
문제를 모두 B로 칠할 때와 R로 칠할 때 두 가지 경우의 수를 고려하여 최소값을 출력한다.
이전 색깔이 어땠는지에 따라 arr배열에 +1을 해주는지 아닌지 정한다.
- B로 먼저 색칠하고 필요 부분에 R을 색칠할 경우
- 시작 지점이 R이면 B로 색칠했다가 R로 색칠해야하므로 arr[0] = 2, 아니면 1로 시작한다.
- s[i]가 B면 이전 값을 그대로 가져간다 -> arr[i] = arr[i - 1]
- s[i]가 R이면 이전 문제의 색이 어땠는지에 따라 +1을 해주거나 그대로 가져간다.
- R로 먼저 색칠하고 필요 부분에 B를 색칠할 경우
- 1번의 반대로 새로운 배열에 값을 저장한다.
- 둘 중 최소값을 출력한다.
문제 링크
소스코드
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<stack>
#include<map>
#include<memory.h>
#include<queue>
using namespace std;
int arr[500001];
int arr2[500001];
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
string s;
cin >> s;
arr[0] = 1;
char pre = s[0];
if (s[0] == 'R')
arr[0]++;
for (int i = 1; i < s.size(); i++)
{
if (s[i] == 'B')
arr[i] = arr[i - 1];
else if (s[i] == 'R')
{
if (s[i] != pre) {
arr[i] = arr[i - 1] + 1;
}
else
arr[i] = arr[i - 1];
}
pre = s[i];
}
arr2[0] = 1;
char pre2 = s[0];
if (s[0] == 'B')
arr2[0]++;
for (int i = 1; i < s.size(); i++)
{
if (s[i] == 'R')
arr2[i] = arr2[i - 1];
else if (s[i] == 'B')
{
if (s[i] != pre2) {
arr2[i] = arr2[i - 1] + 1;
}
else
arr2[i] = arr2[i - 1];
}
pre2 = s[i];
}
cout << min(arr[n - 1], arr2[n - 1]);
}
Author And Source
이 문제에 관하여(백준 20365번 - 블로그2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@pjh612/백준-20365번-블로그2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)