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

 

이번에 볼 문제는 백준 10009번 문제인 Loteria 2이다.
문제는 아래 링크를 확인하자.

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

 

공에 적힌 수가 두 가지 이상일 경우 어떤 수를 바꾼다면 양 옆의 수와 다른 수를 항상 골라 그 수로 바꿀 수 있음을 관찰하자. 따라서 이 경우 고른 수를 왼쪽부터 살피면서 같은 수가 적힌 공이 연속으로 있는 지점을 발견할 때마다 오른쪽 공을 양 옆 수와 다른 수를 적어넣는 것으로 최소 횟수의 수정으로 조건을 만족하는 수열을 만들 수 있음을 알 수 있다.

 

공에 적힌 수가 두 가지뿐인 경우를 생각해 보자. 두 수를 1과 2라고 하면 가능한 수열은 1과 2가 교대로 등장하는 수열 두 가지(1로 시작, 2로 시작)뿐이다. 따라서 이 두 가지 중 어떤 수열로 바꾸는 것이 비용이 덜 드는지를 확인해 문제를 해결할 수 있다.

 

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

#include <iostream>
using namespace std;

int N, K;
int A[500000];
int cnt1, cnt2;

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

	cin >> N >> K;
	for (int i = 0; i < N; i++) cin >> A[i];
	if (K == 2) {
		for (int i = 0; i < N; i++) {
			if (i & 1) {
				if (A[i] == 1) cnt1++;
				else cnt2++;
			}
			else {
				if (A[i] == 1) cnt2++;
				else cnt1++;
			}
		}
		cout << min(cnt2, cnt1);
	}
	else {
		int old = 0, ans = 0;
		for (int i = 0; i < N; i++) {
			if (A[i] == old) ans++, old = 0;
			else old = A[i];
		}
		cout << ans;
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1341 // C++] 사이좋은 형제  (2) 2024.10.17
[BOJ 23615 // C++] Product  (4) 2024.10.16
[BOJ 18066 // C++] Move & Meet  (7) 2024.10.14
[BOJ 13021 // C++] 공 색칠하기  (1) 2024.10.11
[BOJ 4304 // C++] Antiarithmetic?  (3) 2024.10.10

+ Recent posts