Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 이미지가 흑백 사진인지 컬러 사진인지 판별하는 방법

이번 글에서는 주어진 이미지가 컬러 사진인지 흑백 사진인지 판별하는 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"가 됩니다.

해결 접근 방식

이 문제는 매우 간단한 선형 탐색으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.

  1. 문자열의 처음부터 끝까지 각 픽셀을 순회합니다.
  2. 현재 픽셀이 'B', 'W', 'G' 어느 것에도 해당하지 않으면, 곧바로 "Color"를 출력하고 함수를 종료합니다.
  3. 순회가 끝날 때까지 컬러 픽셀이 발견되지 않았다면 "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 채널 값을 검사해 흑백 이미지를 걸러내는 기법이 널리 활용됩니다.