분당아재의 솔직한 블로그

파이썬을 게임하듯 문제를 풀며 공부하는 checkio.org의 Home Section 여섯번째 미션, All The Same 입니다. 

어렵게 머리를 써가며 문제를 풀었는데, 다른 분들이 푼 답안을 보고 깜짝 놀란 미션이기도 합니다. ㅎㅎ

입력으로 주어진 List가 모두 같으면 True, 하나라도 다르면 False를 return 하는 문제입니다.

all_the_same([1, 1, 1]) == True  # List의 값이 모두 1로 같으므로 True

all_the_same([1, 2, 1]) == False # List의 값이 1, 2로 다르므로 False

all_the_same(['a', 'a', 'a']] == True # List의 값이 모두 a로 같으므로 True


주어진 input은 짧지만 어떻게 풀까 고민하다가

List의 0번째 값과 1번째 값을 비교해서 같은지,

List의 1번째 값과 2번째 값을 비교해서 같은지,

이런 순서로 List의 인덱스를 하나씩 증가시키며 그 다음 값과 비교해서 

끝까지 값이 같으면 True를 return하고, 중간에 값이 바뀌면 False를 리턴하는 코드를 작성해서

미션을 풀었습니다. 


그러다가, 다른 답안을 보고 깜짝 놀랐네요.

바로 set()를 사용한 것입니다. 


set()의 특징 중 하나가 바로 중복을 허용하지 않고, 순서를 두지 않는 것인데요.

이 점을 이용해서 중복을 한방에 제거하는 것이였죠.


set([1, 1, 1]) 을 하면 중복을 제거한 {1}이 나옵니다. 

set([1, 2, 1, 2, 3]}을 하면 역시 중복된 값을 합친 후, {1, 2, 3}이 나옵니다.


이런 set()의 특징을 이용하니

all_the_same() 함수에서 return 문 하나로 문제해결이 되네요. 

return len(set(elements)) <= 1

1. set(elements) 문으로 elements 안의 중복을 모두 제거합니다. 

2. len()을 써서 set(elements)의 남은 값을 카운트 합니다.

   여기에서 len() 값이 1이면 elements의 값이 모두 중복이라는 뜻이고,

   len() 값이 2이상이면 elements의 값이 각각 다른 값을 가진 것이죠.

3. len(set(elements)) <=1 문장은 len() 값이 1보다 작은 지 큰 지를 비교하여 True, False를 남겨줍니다.

   따라서, elements의 값이 모두 중복이면 len()이 1이니까 True를 return하고,

   그렇지 않은 경우, False를 return 합니다. 


아주 간단하지만 중복을 제거하는 경우에 유용하게 사용할 수 있는 set() 함수네요.

꼭 기억해야겠습니다. 


Comment +0