TIL - algorithm - 05

김영훈·2021년 3월 10일
0

# 같은 숫자는 싫어

  • 오류 코드
    def solution(arr):

        i = 0

        while i < len(arr):
            try:
                if arr[i] == arr[i+1]:  # "요소 제거는" 효율성 문제가 존재... 1. 인덱스를 활용하여 요소 추가하는 방식을 추천
                    arr.pop(i)          # "제거보단 추가"
                    i += 0              #  요소 값을 삭제했기 때문에 인덱스 유지
            
                else:
                    i += 1
        
            except IndexError:          # 변화식 입력하지 않으면 무한 루프된다.
                i += 1

        answer = arr

        return answer
  • 문제점

    • 리스트 내부 인접 요소값을 비교하여 값이 같은 경우, pop() 혹은 remove()해당 요소삭제하는 방식의 코딩 ➡ 효율성이 떨어지는 코드가 될 가능성이 높음
  • 정답 코드
    def solution(arr):

        answer = []

        for i in range(len(arr)):

            if i == 0:                  # i가 0일 때는, 비교할 값이 없으므로 반드시 값을 추가해야 한다.
                answer.append(arr[i])   # 기존 리스트에서 중복되는 값을 제거하는 대신,
                                        # 새롭게 생성한 리스트 객체 answer에 중복되지 않게 값을 추가하도록 하였다.
            elif arr[i] != arr[i-1]:
                answer.append(arr[i])

            elif arr[i] == arr[i-1]:
                continue

        return answer
    print(solution([4,4,4,3,3]))        # 결괏값: [4, 3]
  • 해결 방법

    • 비어있는 리스트 answer 생성 후, 그 안에 중복되지 않게 값을 추가(append())하는 방식을 선택했다.

# 포켓몬

  • '같은 숫자는 싫어'비슷한 유형의 문제. 주어진 nums 객체의 요소 중에서 같은 숫자를 제거하는 것이 핵심이다. 이를 위해 비어있는 리스트 x 생성 후, 그 안에 중복되지 않게 값을 추가하는 방식으로 문제를 해결했다.
    def solution(nums):   
        answer = 0        # 중복되는 요소를 제외할 때는 append()를 사용하는 것이 효율적이라는 사실을 다시 한번 확인
        x = []

        for i in range(len(nums)):
    
            if i == 0:
                x.append(nums[i])
                answer += 1

            elif nums[i] in x:               # 리스트 x에 이미 존재하는 요소는 추가하지 않고 다음 loof로 이동
                continue

            else:
                if answer < len(nums) // 2:  # 리스트 x의 길이는 nums 객체 길이의 절반으로 제한되므로, 
                                             # 이를 초과하지 않는 범위 내에서 값을 추가한다.
                    x.append(nums[i])
                    answer += 1

                else:
                    continue
  
        return answer, x
        
    print(solution([3,3,3,2,2,4]))           # 결괏값: (3, [3, 2, 4])

# review

  • 리스트 안의 중복 요소를 제거할 땐 pop(), remove()을 활용하기보단 append()로 중복되지 않은 값을 채워 넣는 방법이 효율적일 수 있다.

  • 리스트 객체를 역순으로 반환하려면 -1부터 시작하는 음수 인덱스를 사용하면 된다(번외)

  • sort(): 요소를 오름차순으로 정렬(번외)

    • 문자열 오름차순

      • 대문자 < 소문자

      • a < b

  • sorted()의 다중 조건 설정(번외)

    • sorted(정렬할 객체, key = lambda x: (첫 번째 조건, 두 번째 조건))
        a = ['apple', 'egg', 'milk', 'cowl', 'socks']

        print(sorted(a, key=lambda x : (x[1], x[2])))  #  결괏값: ['egg', 'milk', 'socks', 'cowl', 'apple']

  • 람다 표현식으로 함수 만들기(번외)

    • 람다 표현식을 활용하면 익명 함수를 만들 수 있다.

    • 람다 표현식으로 만든 함수를 호출하려면, 람다 표현식을 변수에 할당해주면 된다.

    • 람다 표현식은 map(), filter(), reduce()의 인수로 함수를 받고자 할 때 사용된다.

    • list comprehension으로 처리가 가능한 경우엔 map(), filter()를 람다 표현식과 함께 사용하기보단, 리스트 표현식을 사용하는 것이 가독성 및 속도 측면에서 좋은 선택이다.

        # 람다 표현식을 변수에 할당하여 호출하기
        
        a = lambda x, y : x + y

        print(a(10, 5))  #  결괏값:  15
        
        # 람다 표현식을 함수의 인수로 사용하기
        
        a = [1, 3, 5, 6, 7, 8, 9]

        x = filter(lambda x : x > 5, a)

        print([v for v in x ])       # 결괏값: [6, 7, 8, 9]

        y = [x for x in a if x > 5]  # list comprehension으로 lambda 표현식 없이 조건 처리가 가능하다.

        print(y)                     # 결괏값: [6, 7, 8, 9]
profile
Difference & Repetition

0개의 댓글