
정답
① unsigned, ② y[i] += x[i – 1 + j] * f[j];, ③ 출력값: 0 0 0 220 220 0 0 0, 데이터 경계의 위치(인덱스): 3, 4
출제 의도
1×3 필터 마스크를 이용한 1차원 데이터 필터링(컨볼루션)의 개념과, 이를 C 언어의 중첩 for 반복문으로 구현하는 방법을 이해했는지 평가하는 문제이다. 또한 부호 없는 문자형을 typedef로 정의하는 문법과, 필터링 결과를 이용해 임계치를 넘는 데이터 경계의 위치를 찾을 수 있는지를 확인한다.
풀이 과정
배열 x, y의 값의 범위가 0에서 255라고 했으므로, 음수가 아닌 1바이트 정수형으로 선언하는 것이 적절하다. 따라서 PIXEL을 부호 없는 문자형으로 정의하기 위해 ①에는 키워드 \( \text{unsigned} \)가 들어가야 한다.
필터링 식은 조건에서 주어진 것처럼 다음과 같다.
$$ y[i] = x[i-1]\cdot m_0 + x[i]\cdot m_1 + x[i+1]\cdot m_2 $$
프로그램에서는 필터 계수 배열 f가 \( [m_0, m_1, m_2] \)를 의미하므로, 인덱스 \( j = 0,1,2 \)를 사용해 다음과 같이 누적 계산을 하면 된다.
$$ y[i] \leftarrow y[i] + x[i-1+j]\cdot f[j] $$
따라서 ②에 들어갈 코드는
$$ y[i] += x[i-1+j] \times f[j] $$
이다. y 배열은 main 함수에서 모두 0으로 초기화되어 있으므로, 각 i에 대해 이 문장을 3번( \( j = 0,1,2 \) ) 수행하면 위의 필터링 식과 동일한 결과를 얻는다.
이제 실제 값으로 계산해 보자. 입력 데이터 x와 필터 계수 f는 다음과 같다.
$$ x = [225, 225, 225, 225, 5, 5, 5, 5], \quad f = [1, 0, -1] $$
SIZE가 8이므로, 함수 filtering 안의 반복문에서 \( i \)는 1부터 6까지 변한다. 각 i에 대해 y[i]를 계산하면 다음과 같다.
$$ \begin{aligned} y[1] &= x[0]\cdot 1 + x[1]\cdot 0 + x[2]\cdot(-1) = 225 + 0 – 225 = 0, \\ y[2] &= x[1]\cdot 1 + x[2]\cdot 0 + x[3]\cdot(-1) = 225 + 0 – 225 = 0, \\ y[3] &= x[2]\cdot 1 + x[3]\cdot 0 + x[4]\cdot(-1) = 225 + 0 – 5 = 220, \\ y[4] &= x[3]\cdot 1 + x[4]\cdot 0 + x[5]\cdot(-1) = 225 + 0 – 5 = 220, \\ y[5] &= x[4]\cdot 1 + x[5]\cdot 0 + x[6]\cdot(-1) = 5 + 0 – 5 = 0, \\ y[6] &= x[5]\cdot 1 + x[6]\cdot 0 + x[7]\cdot(-1) = 5 + 0 – 5 = 0. \end{aligned} $$
경계에서의 양끝 인덱스 0과 7은 필터링을 수행하지 않으므로 초기값 0이 그대로 남는다. 따라서 y 배열 전체는
$$ y = [0, 0, 0, 220, 220, 0, 0, 0] $$
가 된다. ③의 for 반복문은 이 배열을 차례대로 출력하므로 출력 결과는
$$ 0\ 0\ 0\ 220\ 220\ 0\ 0\ 0 $$
이다.
임계치(threshold)가 100이라고 했으므로, 데이터 경계는 \( y[i] > 100 \)인 위치에서 나타난다. 위 결과에서 100보다 큰 값은 \( y[3] = 220 \)과 \( y[4] = 220 \)뿐이므로, 데이터 경계의 위치(인덱스)는
$$ i = 3,\ 4 $$
이다.
<풀이가 부정확할 수 있으니 반드시 교차검증 확인 바랍니다.>