세 개의 숫자 x, y, z가 주어졌을 때 이들의 곱을 구하는 문제를 생각해 보겠습니다. 단, 두 개 이상의 숫자가 서로 같다면 해당 값은 곱셈에서 제외해야 합니다.
예를 들어 입력이 x = 5, y = 4, z = 2라면 세 숫자가 모두 서로 다르므로 결과는 5 * 4 * 2 = 40이 됩니다.
문제 해결 접근 방법
- 중복 여부를 추적할 temp_set과, 중복으로 판별된 값을 담을 remove라는 두 개의 집합(set)을 생성합니다.
- [x, y, z]의 각 요소 i에 대해 다음을 수행합니다.
- i가 이미 temp_set에 존재한다면 remove 집합에 i를 추가합니다.
- i를 temp_set에 추가합니다.
- remove 집합의 각 요소 i를 temp_set에서 삭제하여 중복값을 제거합니다.
- 곱셈 결과를 저장할 multiplied 변수를 1로 초기화합니다.
- temp_set에 남아 있는 각 고유 값 i를 multiplied에 곱합니다.
- 최종 multiplied 값을 반환합니다.
동작 원리
집합(set)은 중복을 허용하지 않는 자료구조이지만, 한 번의 순회만으로 중복값을 걸러내기 위해서는 '이미 본 값'과 '중복으로 확인된 값'을 따로 관리할 필요가 있습니다. 첫 번째 집합은 지금까지 등장한 값을 기록하고, 두 번째 집합은 두 번 이상 등장한 값을 표시합니다. 이후 표시된 값들을 첫 번째 집합에서 삭제하면 오직 고유한 값만 남게 되고, 이 값들을 모두 곱하면 원하는 결과를 얻을 수 있습니다.
예제 코드
class Solution:
def solve(self, x, y, z):
temp_set = set()
remove = set()
for i in [x, y, z]:
if i in temp_set:
remove.add(i)
temp_set.add(i)
for i in remove:
temp_set.remove(i)
multiplied = 1
for i in temp_set:
multiplied *= i
return multiplied
ob = Solution()
print(ob.solve(5, 4, 2))
입력
5, 4, 2
출력
40
위 코드에서 세 숫자 5, 4, 2는 모두 서로 다르므로 어떤 값도 제외되지 않고, 전체 곱인 40이 그대로 반환됩니다. 만약 입력이 5, 5, 2였다면 중복된 5가 제거되어 결과는 10이 됩니다.