※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 26075번 문제인 곰곰아 선 넘지마이다.
문제는 아래 링크를 확인하자.

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

 

26075번: 곰곰아 선 넘지마

1001, 0110 둘 다 가능한 모습이다. 1010 으로 만드는 경우, S 는 1번, T 는 3번의 연산을 수행해서 총 1+9=10 의 비용이 소모된다.

www.acmicpc.net

한 문자열을 다른 문자열로 바꾸는 데에 필요한 연산의 최소 횟수를 구하고, 그 연산과정의 절반(필요한 연산의 개수가 홀수인 경우 1차이는 날 수 있다)을 역순으로 목표문자열에 적용하는 것으로 두 문자열에 각각 적용한 연산 횟수의 제곱의 합을 최소화할 수 있다.

 

한 문자열을 다른 문자열로 바꾸는 데에 필요한 연산의 최소 횟수는 두 문자열의 k번째 1의 위치를 맞춰주는 데에 필요한 횟수, 즉 두 문자열의 k번째 1의 인덱스의 차들을 합하는 것으로 계산할수 있다

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;
typedef long long ll;

ll N, M;
string s1, s2;

ll cnt = 0;
int arr[100000];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> M >> s1 >> s2;
	int i = 0;
	for (int ii = 0; ii < N + M; ii++) {
		if (s1[ii] == '1') arr[i++] = ii;
	}
	i = 0;
	for (int ii = 0; ii < N + M; ii++) {
		if (s2[ii] == '1') cnt += abs(ii - arr[i++]);
	}

	cout << (cnt / 2) * (cnt / 2) + (cnt - cnt / 2) * (cnt - cnt / 2);
}
728x90

+ Recent posts