ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬 코테 6기] 1주차 세션 정리
    기타/파이썬 코테 스터디 6기 2021. 7. 29. 18:12

    이 글은 프로그래머스에서 진행하는 코딩테스트와 실무 역량 모두 잡는 알고리즘 스터디(Python반) 6기를 참여하면서 일주일에 한 번(매주 수요일) 진행되는 세션에서 배운 내용을 정리하는 글이다.

    오늘은 1주차 세션(2021년 07월 28일 진행)에서 배운 내용을 정리해보려고 한다.

    https://programmers.co.kr/learn/courses/12441

     

    [스터디/6기] 코딩테스트와 실무 역량 모두 잡는 알고리즘 스터디(Python반)

    × 이번 기수는 마감되었습니다. 대기자 신청 을 해주시면 쿠폰과 함께 가장 먼저 연락드리겠습니다. 코딩테스트와 실무 역량 모두 잡는 스터디: Python반 코딩테스트 운영진과 실무 개발자가 뭉

    programmers.co.kr

    스터디에 대한 전체적인 후기나 진행과정은 모든 과정이 끝나고 남기려고 한다.

     

     


    <세션을 통해 배운 점>

    1. remove()는 시간복잡도가 O(n)이다.

    remove()는 매개 값으로 지정한 값과 리스트에서 같은 값을 검색후 여러 값들이 존재하면 그 중에서 첫 번째 값을 삭제하는 기능을 한다.

    리스트의 요소를 삭제 할때 del이나 pop도 많이 사용하지만 이들과 다른 점은 매개 값으로 인덱스 번호를 받는 것이 아닌 실제 요소 값을 받는다는 것이다.remove()를 사용할 때 알아두어야 할것은 시간복잡도가 O(n)이라는 것이다.만약에 아래와 같이 for문을 돌리며 그 안에서 remove()를 사용하면 시간복잡도가 O(n^2)가 되기 때문에 효율성테스트에 주의를 해야한다.

    arr = [1,2,3,4,5,...] // 길이가 n인 배열
    
    for i in arr:
        if i == 3:
            arr.remove(i)

     

     

     

    2. for-else를 사용해보자.

    else는 if문과 함께 쓰이는 것으로 친숙하다.

    for-else는 들어는 봤지만 실제로 쓸 생각은 못해봤고 오늘로써 for-else의 장점을 알 수 있었다.

    for-else는 for문의 실행문들이 실행되면서 break되지 않고 정상적으로 정해진 범위를 다 반복했다면 else문에서 지정한 실행문들을 실행하는 것이다.

    매커니즘이 글로만 보면 잘 이해가 안되므로 그림을 봐보자.

     

    간단한 코드를 보며 어떻게 실행되는지를 알아보자.

    for i in range(1, 5):
        print(i,"번째 반복 실행문입니다.")
        if i == 3:
            break
    
    else:
        print("else 실행문입니다.")

    i가 1부터 4까지 반복을 할 것이고 i가 3이면 if문에 의해 break되어 반복이 멈출 것이다.

    위 설명대로라면 else의 실행문은 실행되지 않을 것이다.

    결과를 보면 아래와 같다.

    그러면 break를 만나지 않은 경우를 보자,

    for i in range(1, 5):
        print(i,"번째 반복 실행문입니다.")
        if i == 5:
            break
    
    else:
        print("else 실행문입니다.")

    똑같이 i는 1부터 4까지 반복되고 i가 5이면 break를 걸도록 조건을 두었으므로 for문은 break없이 끝까지 돌 것이다.

    그러면 else에 지정한 실행문이 실행될 것이다.

    결과를 봐보면 아래와 같다.

     

    이러한 for-else문은 코딩테스트에서 이중 for문을 돌릴 때 flag변수를 두지 않아도 된다는 장점을 가질 있다.

    그리고 코드가 더 간결해보이는 장점을 가질 수 있다.

     

     

     

    3. Counter() - Counter() 연산이 가능하다.

    Counter()는 어떠한 리스트, 튜플, 문자열 등 반복 가능한 객체 내에 있는 요소의 각각의 갯수를 key, value로 딕셔너리 형태로 봔환을 해주는 역할을 한다.

    collections 모듈에 있는 클래스로 Counter()를 사용하고 싶다면

    import colletcions를 해주어 collections.Counter()로 이용하거나

    from collections import Counter를 해주어 Counter()를 이용하면 된다.

     

    Conunter()클래스를 실제로 사용해봐서 결과가 어떠한지 봐보자.

    from collections import Counter
    
    arr = [1,2,4,1,2,2,3,3,3,3]
    counter_arr = Counter(arr)
    
    print(counter_arr)
    print(type(counter_arr))
    print(counter_arr.keys())
    print(counter_arr.values())

    arr 리스트 내에 있는 요소를 key로 요소의 갯수를 value로 쌍을 이루어 마치 딕셔너리 형태로 반환해주는 것을 볼 수 있다.

    그리고 type은 collections.Counter 객체 타입이고 딕셔너리에서 자주 사용하는 메서드를 사용할 수 있는 것을 볼 수 있다.

    이러한 Counters()는 마치 차집합과 같은 연산을 할 수 있다.

    코드를 보며 어떻게 연산이 되는지 알아보자.

    from collections import Counter
    
    arr1 = [1,2,4,1,2,2,3,3,3,3]
    arr2 = [1,2,3,1,1,2]
    counter_arr1 = Counter(arr1)
    counter_arr2 = Counter(arr2)
    
    print("counter_arr1 : ", counter_arr1)
    print("counter_arr2 : ", counter_arr2)
    print("counter_arr1 - counter_arr2 : ", counter_arr1 - counter_arr2)

    counter_arr1 -  counter_arr2연산을 해보았더니 counter_arr1과 counter_arr2가 공통적으로 가지고 있는 값은 없어지고 마치 차집합이 반환된 것을 볼 수 있다.

    즉, counter_arr1와 counter_arr2가 공통적으로 가지고 있는 1:2, 2:2, 3:1를 제외하고 counter_arr1만 가지고 있는 key, value만 반환해주는 것이다.

     

    이러한 연산은 두 개의 reapeatable한 객체가 가지고 있는 요소들 중에 하나의 reapeatable한 객체만 가지고 있는 요소를 구할 때 유용하게 쓰일 수 있다.

    보통은 for문을 두 개씩 돌리면 비교하거나 sort를 이용하여 비교하는데 Counter() 클래스를 사용하면 편하게 원하는 결과를 얻을 수 있다.

     

     


    <1주차 세션 회고>

    스터디의 첫 세션으로 사전에 주어진 4문제의 테스트를 진행한 후에 참여한 것이다.

    4개 문제 중에 3개는 100점을 맞았고 1문제는 어떻게 풀어야할지 머릿 속으로는 그려지지만 코드로 나오지를 않아서 풀지 못했다.

     

    그 후, 첫 번째 세션 날((2021년 07월 28일)이 되었고 사전 테스트에서 제공된 문제 중 3문제를 리더님이 라이브 코딩을 해주셨다.

    위에서 정리한 꿀팁을 얻은 것도 좋았지만 알고리즘 문제풀이를 할 때 어떠한 자세와 생각을 가지고 문제를 푸는지를 알 수 있는 좋은 기회였다.

    그리고 내가 생각하지 못했던 문제풀이 방법을 접할 수 있었고 앞으로 조금 더 시간을 투자하여 하나의 문제를 풀더라도 더 좋은 문제풀이 방법을 생각하고 얻어내야겠다는 생각을 가졌다.

     

    시작은 항상 흥미롭고 즐겁다.

    비록 이 스터디가 4주 밖에 진행이 안되지만 스터디가 진행되고 스터디가 끝나더라도 앞으로의 취업을 위한 코딩테스트와 기본 자료구조, 알고리즘 지식을 위해 오늘의 마음가짐이 끝까지 이어졌으면 좋겠다.

     

    댓글

Designed by Tistory.