사용자로부터 입력받은 양의 정수 배열이 주어졌을 때, 홀수 번 등장하는 숫자를 찾아야 합니다. 이 문제는 파이썬의 lambda 표현식과 functools.reduce() 함수를 조합하면 단 한 줄의 핵심 로직으로 간단하게 해결할 수 있습니다.
문제 예시
입력 : A=[2, 4, 7, 7, 4, 2, 2] 출력 : 2
위 예시에서 2는 세 번, 4와 7은 두 번씩 등장합니다. 따라서 홀수 번 등장하는 숫자는 2입니다.
알고리즘
- 배열의 요소를 입력받습니다.
- 람다(lambda) 표현식을 작성하고 적용합니다.
- 입력 리스트에 reduce 함수를 적용해 값 하나만 남을 때까지 반복합니다.
- 람다 표현식은 a ^ b(XOR 연산) 결과를 하나의 값으로 누적합니다.
- 초기값 a는 0부터 시작하고, b에는 리스트의 요소가 차례대로 전달됩니다.
XOR 연산이 동작하는 원리
이 방법이 성립하는 핵심은 XOR(배타적 논리합, ^) 연산의 특성입니다.
- a ^ a = 0 : 같은 수를 두 번 XOR하면 0이 됩니다.
- a ^ 0 = a : 어떤 수든 0과 XOR하면 자기 자신이 됩니다.
따라서 짝수 번 등장하는 숫자들은 서로 상쇄되어 사라지고, 최종적으로 홀수 번 등장한 숫자만 남게 됩니다.
예제 코드
# Python program to find the Number
# Occurring Odd Number of Times
# using Lambda expression and reduce function
from functools import reduce
def timeoccurrance(inp):
print("RESULT ::>", reduce(lambda a, b: a ^ b, inp))
# Driver program
if __name__ == "__main__":
A = list()
n1 = int(input("Enter the size of the List ::"))
print("Enter the Element of List ::")
for i in range(int(n1)):
k = int(input(""))
A.append(k)
timeoccurrance(A)
실행 결과
Enter the size of the List :: 7 Enter the Element of List :: 1 2 3 2 3 1 3 RESULT ::> 3
위 실행 결과에서 1과 2는 각각 두 번, 3은 세 번 등장했습니다. 짝수 번 등장한 1과 2는 XOR 과정에서 서로 상쇄되므로, 최종 결과로 3이 출력됩니다.