Softeer Lv3 : 이미지 프로세싱 [C]

문제

Softeer Lv3 : 이미지 프로세싱 – https://softeer.ai/practice/6250


알고리즘

Input: 이미지 크기(H, W), 이미지, 연산 횟수(Q), 연산(i, j, c)

  1. 이미지 업데이트
    1.1. 현재 픽셀의 색상 저장
    1.2. 이미 바꿀 색과 같다면 처리하지 않음
    1.3. 색상 변경
    1.4. 범위 내에 있으며 색상이 같을 때 재귀 호출

Output: 최종 이미지


소스코드

#include <stdio.h>

#define MAX 128

int H, W, Q;
int map[MAX][MAX];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

/* Func: 이미지를 업데이트 */
void solution(int x, int y, int n) {
    int num = map[x][y];  /* 1.현재 픽셀의 색상 저장 */
    if(num == n) return;  /* 2.이미 바꿀 색과 같다면 처리하지 않음 */
    map[x][y] = n;  /* 3.색상 변경 */
    for (int k = 0; k < 4; k++) {
        int nx = x + dx[k];
        int ny = y + dy[k];
        
        /* 4.범위 내에 있으며 색상이 같을 때 재귀 호출 */
        if (0 <= nx && nx < H && 0 <= ny && ny < W && map[nx][ny] == num)
            solution(nx, ny, n);
    }
}

int main() {
    /* Input: 이미지 크기 */
    scanf("%d %d", &H, &W);

    /* Input: 이미지 */
    for (int k = 0; k < H; k++) {
        for (int l = 0; l < W; l++) {
            scanf("%d", &map[k][l]);
        }
    }

    /* Input: 연산 횟수 */
    scanf("%d", &Q);

    /* Input: 연산 */
    for (int k = 0; k < Q; k++) {
        int i, j, c;
        scanf("%d %d %d", &i, &j, &c);
        i--, j--;  /* 1-based 인덱스를 0-based로 변환 */
        solution(i, j, c);  /* 1.이미지 업데이트 */
    }

    /* Output: 최종 이미지 */
    for (int k = 0; k < H; k++) {
        for (int l = 0; l < W; l++) {
            printf("%d ", map[k][l]);
        }
        printf("\n");
    }

    return 0;
}

Leave a Comment