이번 글에서는 주어진 이미지가 컬러 사진인지 흑백 사진인지 판별하는 C++ 프로그램을 살펴보겠습니다.
문제 정의
이미지는 총 n개의 픽셀로 구성되어 있으며, 각 픽셀은 다음 여섯 가지 색상 중 하나입니다.
- 'C' — 시안(Cyan)
- 'M' — 마젠타(Magenta)
- 'Y' — 옐로(Yellow)
- 'W' — 화이트(White)
- 'G' — 그레이(Grey)
- 'B' — 블랙(Black)
각 픽셀의 색상 정보는 문자열 'pixels'에 담겨 전달됩니다. 이 문자열을 분석해 해당 사진이 컬러인지 흑백인지 판별해야 합니다.
판별 기준은 다음과 같습니다.
- 픽셀 중 하나라도 'C', 'M', 'Y'가 포함되어 있다면 → "Color" 출력
- 모든 픽셀이 'W', 'G', 'B'로만 이루어져 있다면 → "BW" 출력
예를 들어, 입력이 n = 10, pixels = "GBWYM"이라면 문자열에 'Y'와 'M'이 포함되어 있으므로 출력 결과는 "Color"가 됩니다.
해결 접근 방식
이 문제는 매우 간단한 선형 탐색으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.
- 문자열의 처음부터 끝까지 각 픽셀을 순회합니다.
- 현재 픽셀이 'B', 'W', 'G' 어느 것에도 해당하지 않으면, 곧바로 "Color"를 출력하고 함수를 종료합니다.
- 순회가 끝날 때까지 컬러 픽셀이 발견되지 않았다면 "BW"를 출력합니다.
알고리즘을 의사 코드로 표현하면 다음과 같습니다.
for initialize i := 0, when i < n, update (increase i by 1), do:
if pixels[i] is not equal to 'B' and pixels[i] is not equal to 'W' and pixels[i] is not equal to 'G', then:
print("Color")
return
print("BW")C++ 구현 예제
위 알고리즘을 실제 C++ 코드로 구현하면 다음과 같습니다.
#include <bits/stdc++.h>
using namespace std;
#define N 100
void solve(int n, string pixels) {
for (int i = 0; i < n; i++) {
if (pixels[i] != 'B' && pixels[i] != 'W' && pixels[i] != 'G') {
cout << "Color";
return;
}
}
cout << "BW";
}
int main() {
int n = 10;
string pixels = "GBWYM";
solve(n, pixels);
return 0;
}실행 결과 확인
입력
10, "GBWYM"
출력
Color
코드 설명 및 복잡도 분석
solve 함수는 문자열을 한 번만 순회하며 각 문자가 흑백 계열('B', 'W', 'G')에 속하는지 검사합니다. 컬러 계열('C', 'M', 'Y') 픽셀을 발견하는 즉시 "Color"를 출력하고 조기 종료하기 때문에 불필요한 연산을 줄일 수 있습니다.
- 시간 복잡도: O(n) — 최악의 경우 모든 픽셀을 한 번씩 검사합니다.
- 공간 복잡도: O(1) — 추가 메모리를 사용하지 않습니다.
이처럼 단순한 조건 검사만으로 이미지의 컬러 여부를 효율적으로 판별할 수 있습니다. 실제 이미지 처리에서도 유사한 원리로 RGB 채널 값을 검사해 흑백 이미지를 걸러내는 기법이 널리 활용됩니다.