이 글에서는 <, <=, !=, >, >=, == 같은 비교 연산자를 비롯해 if 문과 같은 조건문을 하나도 사용하지 않고, 입력된 숫자가 홀수인지 짝수인지 판별하는 C 프로그램을 작성하는 방법을 소개합니다.
조건문을 자유롭게 쓸 수 있다면 문제는 아주 간단합니다. 숫자를 2로 나눈 나머지가 0이면 짝수, 그렇지 않으면 홀수로 판정하면 됩니다. 또는 숫자와 1을 비트 AND(&) 연산했을 때 결과가 0이면 짝수, 1이면 홀수라고 구분할 수도 있습니다.
하지만 이번에는 어떤 형태의 조건문도 사용할 수 없습니다. 그럼에도 홀수와 짝수를 정확히 구분할 수 있는 두 가지 방법을 살펴보겠습니다.
방법 1. 문자열 배열의 인덱스로 판별하기
크기가 2인 문자열 배열을 준비하고, 인덱스 0에는 "Even"(짝수), 인덱스 1에는 "Odd"(홀수)를 미리 저장해 둡니다. 그다음 숫자를 2로 나눈 나머지(n % 2)를 그대로 배열의 인덱스로 넘기면, 별도의 조건 검사 없이 결과가 자동으로 선택됩니다.
- n % 2가 0이면 → arr[0] → "Even"
- n % 2가 1이면 → arr[1] → "Odd"
예제 코드
#include <stdio.h>
int main() {
int n;
char* arr[2] = {"Even", "Odd"}; /* 인덱스 0: 짝수, 인덱스 1: 홀수 */
printf("Enter a number: "); /* 사용자로부터 숫자 입력 */
scanf("%d", &n);
printf("The number is: %s", arr[n % 2]); /* 나머지를 인덱스로 사용 */
return 0;
}
실행 결과 1
Enter a number: 40 The number is: Even
실행 결과 2
Enter a number: 89 The number is: Odd
방법 2. 논리 연산자와 비트 연산자로 판별하기
두 번째 방법은 논리 연산자(&&, ||)와 비트 연산자(&)의 특성을 활용한 트릭입니다. 먼저 숫자와 1을 비트 AND 연산해 최하위 비트(LSB)를 확인합니다. 이 값이 1이면 홀수, 0이면 짝수입니다.
여기서 핵심은 단락 평가(short-circuit evaluation)입니다. && 연산자는 왼쪽이 거짓(0)이면 오른쪽을 실행하지 않고, || 연산자는 왼쪽이 참이면 오른쪽을 건너뜁니다. 따라서 아래 코드에서는 n & 1의 결과가 1일 때만 "odd"가 출력되고, 0이면 "even"이 출력됩니다.
예제 코드
#include <stdio.h>
int main() {
int n;
printf("Enter a number: "); /* 사용자로부터 숫자 입력 */
scanf("%d", &n);
/* n & 1 : 최하위 비트가 1이면 홀수 → "odd" 출력,
0이면 && 가 단락되어 || 뒤의 "even" 출력 */
(n & 1 && printf("odd")) || printf("even");
return 0;
}
실행 결과 1
Enter a number: 40 even
실행 결과 2
Enter a number: 89 odd
마무리
두 방법 모두 if, else 같은 조건 분기 없이 짝수와 홀수를 정확하게 구분합니다. 방법 1은 배열 인덱싱을, 방법 2는 단락 평가를 활용한다는 점이 가장 큰 차이입니다. 실제 개발에서는 가독성을 위해 일반적인 조건문을 사용하는 것이 좋지만, 면접이나 코딩 테스트에서 자주 등장하는 유형이므로 이런 트릭도 알아두면 도움이 됩니다.