주어진 줄 수를 바탕으로 최소한의 복잡도로 대칭 이중 삼각형(symmetric double triangle) 패턴을 출력하는 것이 이번 문제의 목표입니다.
예시
입력: 5
출력:
X
X
O X
O X
X O X O X
X O
X O
X
X문제 접근 방식
전체 패턴은 크게 세 부분으로 나누어 생각할 수 있습니다.
윗부분(상단): n이 홀수일 때는 n-1줄, 짝수일 때는 n-2줄을 출력합니다.
중간 부분: n이 홀수일 때는 1줄, 짝수일 때는 3줄을 출력합니다.
아랫부분(하단): n이 홀수일 때는 n-1줄, 짝수일 때는 n-2줄을 출력합니다.
알고리즘
START
STEP 1: IF (n % 2 == 0) then
x = x - 1;
공백 개수 p = n – 1로 정의
문자 개수 s = 1로 정의
STEP 2: LOOP FOR i = 1 AND i <= (x - 1) / 2 AND i++
LOOP FOR j = 1 AND j <= p AND j++
공백 출력
END LOOP
IF i % 2 != 0 then
STEP 11 Printx(s) 호출
ELSE
STEP 12 Printo(s) 호출
END
개행 출력
p를 1 증가
LOOP FOR j = 1 AND j <= p AND j++
공백 출력
END LOOP
IF i % 2 != 0 then
STEP 11 Printx(s) 호출
ELSE
STEP 12 Printo(s) 호출
END IF
개행 출력
p를 1 감소
s를 1 증가
END LOOP
STEP 3: IF n % 2 == 0 {
LOOP FOR i = 1 AND i <= p AND i++
공백 출력
IF n % 4 != 0 then
STEP 11 Printx(n/2) 호출
ELSE
STEP 12 Printo(n/2) 호출
END IF
공백 출력
END IF
STEP 4: IF n % 2 != 0 then
Printx(n) 호출
ELSE
IF n % 4 != 0 then
n을 2로 나눈 뒤 Printx(n/2) 두 번 호출
ELSE
Printx(n/2)와 Printo(n/2) 호출
END IF
END IF
개행 출력
STEP 5: IF n % 2 == 0 then {
공백 출력
Printx(n/2) 호출
개행 출력
END IF
STEP 6: SET p = 1
STEP 7: IF n % 2 == 0
x를 1 감소
SET p = 2
END IF
STEP 8: SET q = x / 2
STEP 9: LOOP FOR i = 1 AND i <= x AND i++
LOOP FOR j = 1 AND j <= p AND j++
공백 출력
END FOR
STEP 11 Printx(q) 호출
IF i % 2 == 0 THEN
q를 1 감소
END IF
개행 출력
p를 1 증가
END FOR
STEP 10: 개행 출력
STEP 11: Printx(n)
LOOP FOR i = 1 AND i <= n AND i++
IF i % 2 != 0 then
x 출력
ELSE
o 출력
END IF
END FOR
STEP 12: Printo(n)
LOOP FOR i = 1 AND i <= n AND i++
IF i % 2 != 0 then
o 출력
ELSE
x 출력
STOPC 언어 구현 코드
#include <stdio.h>
// x로 시작하여 x와 o를 번갈아 출력하는 함수
int printx(int n) {
int i;
for (i = 1; i <= n; i++) {
if (i % 2 != 0)
printf("x ");
else
printf("o ");
}
return 0;
}
// o로 시작하여 o와 x를 번갈아 출력하는 함수
int printo(int n) {
int i;
for (i = 1; i <= n; i++) {
if (i % 2 != 0)
printf("o ");
else
printf("x ");
}
return 0;
}
// n에 대한 패턴을 출력하는 함수
int printpattern(int n) {
// 윗부분
// 홀수일 때는 n-1줄, 짝수일 때는 n-2줄
int x = n;
int i, j;
if (n % 2 == 0)
x = x - 1;
// 각 줄에서 남겨둘 공백의 개수
int p = n - 1;
// 각 줄의 문자 개수
int s = 1;
// 반복할 때마다 두 줄씩 출력
for (i = 1; i <= (x - 1) / 2; i++) {
for (j = 1; j <= p; j++) {
printf(" ");
}
if (i % 2 != 0)
printx(s);
else
printo(s);
printf("\n");
p++;
for (j = 1; j <= p; j++)
printf(" ");
if (i % 2 != 0)
printx(s);
else
printo(s);
printf("\n");
p--;
s++;
}
// 짝수일 때 추가되는 상단 중간 줄
if (n % 2 == 0) {
for (i = 1; i <= p; i++)
printf(" ");
if (n % 4 != 0)
printx(n / 2);
else
printo(n / 2);
printf("\n");
}
// 중간 줄
if (n % 2 != 0)
printx(n);
else {
if (n % 4 != 0) {
printx(n / 2);
printx(n / 2);
} else {
printx(n / 2);
printo(n / 2);
}
}
printf("\n");
// 짝수일 때 추가되는 하단 중간 줄
if (n % 2 == 0) {
printf(" ");
printx(n / 2);
printf("\n");
}
// 아랫부분
p = 1;
if (n % 2 == 0) {
x--;
p = 2;
}
int q = x / 2;
// 반복할 때마다 한 줄씩 출력
for (i = 1; i <= x; i++) {
for (int j = 1; j <= p; j++)
printf(" ");
printx(q);
if (i % 2 == 0)
q--;
printf("\n");
p++;
}
printf("\n");
return 1;
}
int main() {
int n = 5;
printpattern(n);
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
X
X
O X
O X
X O X O X
X O
X O
X
X정리
이 패턴 문제의 핵심은 n의 홀짝 여부와 n을 4로 나눈 나머지에 따라 출력 로직을 분기 처리하는 것입니다. 공백 개수(p)와 문자 개수(s 또는 q)를 단계별로 조절하면 복잡한 대칭 구조도 반복문만으로 깔끔하게 구현할 수 있습니다. 특히 printx()와 printo() 함수를 분리해 두면 시작 문자만 바꿔 재사용할 수 있어 코드의 가독성과 유지보수성이 크게 향상됩니다.