프로그래머스의 LV1 완주하지 못한 선수 문제를 풀다 Counter를 이용헤 풀면 쉽게 풀수 있다는걸 알게 되었다.
문제 링크:
https://programmers.co.kr/learn/courses/30/lessons/42576
(완주하기 못한 선수) 문제를 간략히 설명하자면 참가자와 완주자의 리스트가 주어지고 이때 완주하지 못한 선수는 한명일때 그 선수의 이름을 출력하는것이 문제였다.
처음에는 두개의 자료를 set형으로 만들어 차칩합을 이용하면 되지 않을까 생각했더니 3번째 case와 같이 참가자가 동명이인인 경우에는 결국 두 리스트의 set자료가 동일해서 이 방법으로 풀지 못하였다.
이럴때 Counter자료형으로 문제를 풀면 쉽게 풀수 있다.!
다음과 같이 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}
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"가 없는것을 확인할 수 있다.
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
의 값이 마이너스가 될 수 있다.
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
를 각각 더해주는것을 볼 수 있다.
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})