99클럽 코테 스터디 5일차 TIL [완주하지 못 한 선수]

여지은·2024년 7월 27일
0

Python Cording Test

목록 보기
6/14
post-thumbnail

- 오늘의 학습 키워드

collections 모듈의 Counter 클래스

- 공부한 내용 본인의 언어로 정리하기

Counter : 파이썬 내장 클래스 중 하나
		  주어진 iterable 내의 요소 개수를 세는 데 사용됨
          dictionary와 비슷하게 동작하지만, 요소의 개수를 자동으로 세어줌
          
- 주요기능 : 요소개수 세기, 사전 메소드 지원(keys(), values(), items()),
		   간단한 연산지원(덧셈, 뺄셈, 교집합, 합집합 등)
           
  - 리스트를 이용한 예제
    fruits = ['apple','banana','orange','apple','apple']
    Counter(fruits)
    => _결과 : Counter({'apple':3,'banana':1,'orange':1})

  - 문자열을 이용한 예제
    text = "apple"
    Counter(text)
    => 결과 : Counter({'p':2,'a':1,'l':1,'e':1})
    
 - 주요메서드 : 요소를 개수만큼 반복해서 반환 elements()
             가장 흔한 요소를 개수와 함께 반환 'n'을 지정하면 'n'개의 요소만큼 반환 most_common([n])
             Counter에서 다른 Counter나 iterable의 요소 개수를 뺌 subtract(iterable or mapping)
             
   - elements() 메소드 예제
     counter = Counter(a=3, b=1)
     list(counter.elements())
     => 결과 : ['a','a','a','b']
   
   - most_common() 메소드 예제
     counter = Counter('abracadabra')
     counter.most_common(2)
     => 결과 : [('a',5),('b',2)]
     counter.most_common(3)
     => 결과 : [('a',5),('b',2),('r',2)]
     
 - Counter 객체 간의 연산
   counter1 = Counter(a=4, b=2, c=0, d=-2)
   counter2 = Counter(a=1, b=2, c=3, d=0)
  
   - 덧셈 counter1 + counter2 => Counter({'a': 5, 'b': 4, 'c': 3})
   - 뺄셈 counter1 - counter2 => Counter({'a': 3})
   - 교집합(최소값) counter1 & counter2 => Counter({'b': 2, 'a': 1})
   - 합집합(최대값) counter1 | counter2 => Counter({'a': 4, 'c': 3, 'b': 2})
   
      

< 오늘의 회고 >

- 어떤 문제가 있었고, 나는 어떤 시도를 했는지

	마라톤에 참여한 선수들의 명단이 주어지고, 완주한 선수들의 명단이 주어질 때, 
    완주하지 못 한 선수의 이름을 return 하되 동명이인이 있을 수 있다.
    
    나는 for문과 if문을 통해 문제를 해결하려고 시도했지만 동명이인 문제에서 실패하였다.
    원인 : 참가자 중 한 명이 동명이인일 경우, 단순히 'in' 연산자를 사용하여 존재 여부를 확인하는 것은 올바르지 않다.


- 어떻게 해결했는지

챗 GPT의 도움을 받아 Counter 클래스를 활용하게되었다.

- 무엇을 새롭게 알았는지

Counter 클래스의 사용법과 시간복잡도를 알게되었다.
각 리스트에 대해 O(N) 시간이 걸리며, 리스트의 차이를 계산하는 것도 O(N)시간이 소요된다.
따라서 위 코드의 알고리즘은 전체 O(N) 시간 복잡도를 가지게 되며, 매우 효율적이다.
profile
항상 why?를 고민하는 사람

0개의 댓글