문제 소개
자연수 n이 주어졌을 때, 이 숫자를 7세그먼트 디스플레이에 표시한 후 거울에 비춘 것처럼 좌우로 뒤집었을 때 그 모양이 원래 숫자와 완전히 동일한지 확인하는 문제입니다.
예를 들어 n = 818이라면, 각 자릿수 8, 1, 8은 모두 좌우 대칭이고 순서 역시 대칭이므로 거울상 역시 '818' 그대로입니다. 따라서 결과는 True입니다.
핵심 아이디어
7세그먼트 디스플레이에서 좌우로 미러링해도 자기 자신과 똑같이 보이는 숫자는 0, 1, 8 세 가지뿐입니다. 나머지 숫자들은 반전되면 다른 모양이 되거나 유효한 숫자 형태가 아니게 됩니다.
따라서 아래 두 조건을 모두 만족하면 해당 숫자의 거울상은 원래 숫자와 같습니다.
- 모든 자릿수가 0, 1, 8 중 하나일 것
- 숫자 전체가 회문(palindrome), 즉 앞뒤가 대칭일 것
풀이 절차
- n을 문자열로 변환합니다(num_str).
- 각 자릿수를 검사하여 0, 1, 8에 속하지 않으면 False를 반환합니다.
- left는 문자열의 시작 위치, right는 마지막 위치를 가리키도록 초기화합니다.
- left < right인 동안 양쪽 끝의 문자가 서로 다르면 False를 반환하고, 같다면 두 포인터를 가운데 방향으로 한 칸씩 이동합니다.
- 모든 검사를 통과하면 True를 반환합니다.
예제 구현
아래 파이썬 코드를 통해 더 쉽게 이해할 수 있습니다 −
def solve(n):
num_str = str(n)
for i in range(len(num_str)):
if num_str[i] not in ['0', '1', '8']:
return False
left = 0
right = len(num_str) - 1
while left < right:
if num_str[left] != num_str[right]:
return False
left += 1
right -= 1
return True
n = 818
print(solve(n))입력
818
출력
True
복잡도 분석
d를 숫자의 자릿수라고 할 때, 시간 복잡도는 O(d)이며 공간 복잡도 역시 문자열 변환 때문에 O(d)입니다. 각 자릿수를 최대 한 번씩만 검사하면 되기 때문에 매우 효율적인 알고리즘입니다.