[Python] Counter를 이용한 두 리스트 간의 동일 원소의 개수 차이 비교하기

Surf in Data·2022년 6월 16일
0

python

목록 보기
14/15
post-thumbnail
post-custom-banner

프로그래머스의 LV1 완주하지 못한 선수 문제를 풀다 Counter를 이용헤 풀면 쉽게 풀수 있다는걸 알게 되었다.

문제 링크:
https://programmers.co.kr/learn/courses/30/lessons/42576

(완주하기 못한 선수) 문제를 간략히 설명하자면 참가자와 완주자의 리스트가 주어지고 이때 완주하지 못한 선수는 한명일때 그 선수의 이름을 출력하는것이 문제였다.

처음에는 두개의 자료를 set형으로 만들어 차칩합을 이용하면 되지 않을까 생각했더니 3번째 case와 같이 참가자가 동명이인인 경우에는 결국 두 리스트의 set자료가 동일해서 이 방법으로 풀지 못하였다.

이럴때 Counter자료형으로 문제를 풀면 쉽게 풀수 있다.!

Counter의 - 와 subtract

다음과 같이 2개의 list를 counter 자료형으로 바꿔보겠다.

from collections import Counter

x = ["a", "a", "a", "b"]
y = ["b", "b", "c", "a"]
x = Counter(x)
y = Counter(y)
print(x)
print(y)
-------------------------------------------------------------
>>>Counter({'a': 3, 'b': 1})
>>>Counter({'b': 2, 'c': 1, 'a': 1}

1. x-y

print(x)
print(y)
print(x-y)
-------------------------------------------------------
>>>Counter({'a': 3, 'b': 1})
>>>Counter({'b': 2, 'c': 1, 'a': 1}
>>>Counter({'a': 2})

즉, x - y를 할때 x의 key와 동일한 key 가 y에 있다면 두개의 value끼리 뺄셈을 해서 Counter 자료형으로 반환을 해준다.

하지만 이때 뺄셈을 한 값이 음수이면 해당 key는 없어지게 된다.
위의 x의 key인 "b"에 해당하는 값은 1이고 y는 2이다. 1-2 = -1이므로 결과로 반환한 Counter에 "b"가 없는것을 확인할 수 있다.

2. x.subtract(y)

print(x)
print(y)
x.subtract(y)
print(x)
-------------------------------------------------------------
>>>Counter({'a': 3, 'b': 1})
>>>Counter({'b': 2, 'c': 1, 'a': 1}
>>>Counter({'a': 2, 'b': -1, 'c': -1})

subtract() 메서드는 각 key의 해당하는 value을 각각 빼준다.

따라서, value의 값이 마이너스가 될 수 있다.

Counter의 +

print(x)
print(y)
print(x+y)
-------------------------------------------------------------
>>>Counter({'a': 3, 'b': 1})
>>>Counter({'b': 2, 'c': 1, 'a': 1}
>>>Counter({'a': 4, 'b': 3, 'c': 1})

두 카운터 끼리의 덧셈은 각 key의 해당하는 value를 각각 더해주는것을 볼 수 있다.

Counter는 집합 연산 또한 가능하다.

print(x)
print(y)
print(x&y)
print(x|y)
---------------------------------------------------------
>>>Counter({'a': 3, 'b': 1})
>>>Counter({'b': 2, 'c': 1, 'a': 1})
>>>Counter({'a': 1, 'b': 1})
>>>Counter({'a': 3, 'b': 2, 'c': 1})
profile
study blog
post-custom-banner

0개의 댓글