두 개의 숫자 n과 m이 주어졌을 때(m은 n의 배수), 정중앙에 "WELCOME"이라는 단어가 들어간 도어매트 패턴을 출력하는 프로그램을 만들어 보겠습니다. 매트의 크기는 n × m이며, 점(.), 하이픈(-), 파이프(|) 기호와 중앙의 텍스트만을 사용해 패턴을 구성해야 합니다.
예를 들어 입력이 n = 5, m = 15라면 출력 결과는 다음과 같습니다.
------.|.------ ---.|..|..|.--- ----WELCOME---- ---.|..|..|.--- ------.|.------
문제 해결 접근 방식
이 문제는 패턴의 대칭성을 활용하면 비교적 간단하게 해결할 수 있습니다. 전체 과정은 다음 세 단계로 구성됩니다.
- 위쪽 패턴 출력: i를 1부터 n-1까지 2씩 증가시키면서, 각 줄마다 int((m − i×3) / 2)개의 하이픈, i개의 '.|.', 그리고 다시 int((m − i×3) / 2)개의 하이픈을 출력합니다.
- 중앙 텍스트 출력: int((m − 7) / 2)개의 하이픈, 'WELCOME', 그리고 int((m − 7) / 2)개의 하이픈을 출력합니다. 여기서 7은 'WELCOME'의 글자 수입니다.
- 아래쪽 패턴 출력: i를 n-2부터 0까지 2씩 감소시키면서 위쪽과 동일한 방식으로 출력하여 상하 대칭을 완성합니다.
파이썬 구현 예제
다음 코드를 통해 실제 구현 방법을 확인해 보겠습니다.
def solve(n, m):
# 위쪽 패턴 출력
for i in range(1, n, 2):
print('-' * int((m - i * 3) / 2) + '.|.' * i + '-' * int((m - i * 3) / 2))
# 중앙 텍스트 출력
print('-' * int((m - 7) / 2) + 'WELCOME' + '-' * int((m - 7) / 2))
# 아래쪽 패턴 출력
for i in range(n - 2, -1, -2):
print('-' * int((m - i * 3) / 2) + '.|.' * i + '-' * int((m - i * 3) / 2))
n = 15
m = 45
solve(n, m)
입력
15, 45
출력
---------------------.|.--------------------- ------------------.|..|..|.------------------ ---------------.|..|..|..|..|.--------------- ------------.|..|..|..|..|..|..|.------------ ---------.|..|..|..|..|..|..|..|..|.--------- ------.|..|..|..|..|..|..|..|..|..|..|.------ ---.|..|..|..|..|..|..|..|..|..|..|..|..|.--- -------------------WELCOME------------------- ---.|..|..|..|..|..|..|..|..|..|..|..|..|.--- ------.|..|..|..|..|..|..|..|..|..|..|.------ ---------.|..|..|..|..|..|..|..|..|.--------- ------------.|..|..|..|..|..|..|.------------ ---------------.|..|..|..|..|.--------------- ------------------.|..|..|.------------------ ---------------------.|.---------------------
코드 핵심 포인트
이 코드의 핵심은 파이썬의 문자열 곱셈입니다. '-' * 10처럼 문자열에 정수를 곱하면 해당 문자가 지정한 횟수만큼 반복된 문자열을 얻을 수 있습니다. 이를 활용해 각 줄에 필요한 하이픈과 '.|.' 패턴의 개수를 계산한 뒤 이어 붙이면 원하는 모양을 쉽게 만들 수 있습니다.
또한 range(1, n, 2)는 1부터 시작하는 홀수만 순회하고, range(n - 2, -1, -2)는 큰 홀수부터 역순으로 순회합니다. 두 반복문을 조합하면 중앙을 기준으로 좌우·상하가 모두 대칭인 마름모 형태의 패턴을 자연스럽게 완성할 수 있습니다.