문제 개요
a + b = c 형태의 방정식이 있고, 이 중 a, b, c 세 항 가운데 하나가 누락되어 있다고 가정해 봅시다. 우리가 해야 할 일은 누락된 값을 찾아내는 것입니다.
예를 들어 입력이 ? + 4 = 9와 같다면, 출력은 5가 되어야 합니다.
해결 접근 방식
이 문제는 다음 단계를 따라 해결할 수 있습니다.
- 문자열에서 모든 공백을 제거한 뒤, '+' 기호와 '=' 기호를 쉼표(',')로 치환합니다.
- 쉼표를 기준으로 문자열을 분할하여 각 항을 담은 리스트(elements)를 만듭니다.
- 인덱스 변수(idx)를 0으로 초기화합니다.
- 리스트의 처음부터 끝까지 순회하면서 숫자가 아닌 요소(즉, '?'로 표시된 누락된 항)의 위치를 찾아 idx에 저장하고 반복을 종료합니다.
- 누락된 위치에 따라 다음과 같이 계산합니다.
- 마지막 항(c)이 누락된 경우: 첫 번째 항 + 두 번째 항
- 두 번째 항(b)이 누락된 경우: 마지막 항 − 첫 번째 항
- 첫 번째 항(a)이 누락된 경우: 마지막 항 − 두 번째 항
구현 예제
아래 코드를 통해 실제 동작을 더 잘 이해할 수 있습니다.
def find_missing(string):
string = string.strip().replace(' ', '')
string = string.replace('=', ',')
string = string.replace('+', ',')
elements = string.split(',')
idx = 0
for i in range(len(elements)):
if not elements[i].isnumeric():
idx = i
break
if idx == 2:
return int(elements[0]) + int(elements[1])
elif idx == 1:
return int(elements[2]) - int(elements[0])
elif idx == 0:
return int(elements[2]) - int(elements[1])
print(find_missing('6 + 8 = ?'))
print(find_missing('? + 8 = 20'))
print(find_missing('5 + ? = 15'))입력
'6 + 8 = ?' '? + 8 = 20' '5 + ? = 15'
출력
14 12 10
코드 설명
먼저 strip()과 replace()를 사용해 문자열에서 공백을 제거하고 연산자를 쉼표로 바꿉니다. 그런 다음 split(',')으로 세 개의 항을 리스트로 분리합니다. 이후 각 항을 검사하여 isnumeric() 결과가 False인 요소, 즉 '?' 자리의 인덱스를 찾습니다.
누락된 위치가 인덱스 2(마지막)라면 덧셈으로 결과를 구하고, 인덱스 1이라면 마지막 값에서 첫 번째 값을 빼고, 인덱스 0이라면 마지막 값에서 두 번째 값을 빼서 누락된 수를 계산합니다. 이 알고리즘은 문자열 길이에 비례하는 선형 시간 O(n) 안에 동작하며, 간단한 산술 관계만으로 정답을 도출하기 때문에 매우 효율적입니다.