TODAY TIL

안녕하세요! 오늘은 배열에서 연속으로 나타나는 숫자를 제거하는 문제를 해결하는 방법을 소개하겠습니다. 이 문제는 배열 arr에 연속으로 나타나는 숫자가 있을 때, 중복된 숫자를 하나만 남기고 제거하여 반환하는 문제입니다. 문제 풀이를 단계별로 설명하겠습니다.

 

문제 설명

  • 배열 arr가 주어집니다.
  • 배열의 각 원소는 0부터 9까지의 숫자로 이루어져 있습니다.
  • 연속적으로 나타나는 숫자를 하나만 남기고 제거한 배열을 반환합니다.
  • 예를 들어:
    • arr = [1, 1, 3, 3, 0, 1, 1]이면 [1, 3, 0, 1]을 반환해야 합니다.
    • arr = [4, 4, 4, 3, 3]이면 [4, 3]을 반환해야 합니다.

제한사항

  • 배열 arr의 크기: 최대 1,000,000
  • 배열 arr의 원소: 0 이상 9 이하의 정수

 

문제 해결 접근법

1. 문제 이해 및 계획

  • 주어진 배열을 순회하면서 연속된 숫자가 중복인지 확인하고, 중복이 아니면 결과 배열에 추가합니다.
  • 각 숫자를 이전 숫자와 비교하여 중복 여부를 판단합니다.

2. 구현 단계

  • 빈 배열 result를 초기화하여 중복되지 않은 숫자를 저장합니다.
  • previous 변수로 이전 숫자를 저장합니다.
  • arr의 각 원소를 순회하며, previous와 비교해 다를 경우에만 result에 추가합니다.

3. 코드 구현

다음은 문제를 해결하는 Python 코드입니다:

 

def solution(arr):
    result = []  # 결과를 저장할 배열
    previous = None  # 이전 원소를 저장할 변수

    for num in arr:
        # 이전 원소와 다를 때만 결과 배열에 추가
        if num != previous:
            result.append(num)
            previous = num  # 현재 숫자를 이전 숫자로 갱신

    return result

# 테스트 케이스
print(solution([1, 1, 3, 3, 0, 1, 1]))  # 출력: [1, 3, 0, 1]
print(solution([4, 4, 4, 3, 3]))        # 출력: [4, 3]

 

4. 코드 설명

  • result 배열은 중복이 제거된 숫자들을 저장합니다.
  • previous 변수는 이전 숫자를 저장해 연속 중복을 판단합니다.
  • arr의 각 숫자를 순회하며 previous와 비교해 다르면 result에 추가하고, previous를 현재 숫자로 갱신합니다.

5. 시간 및 공간 복잡도

  • 시간 복잡도: O(n)O(n) — 배열을 한 번 순회하므로 매우 효율적입니다.
  • 공간 복잡도: O(n)O(n) — 중복이 제거된 결과 배열을 저장하기 때문입니다.

마무리

이 코드로 연속된 중복 숫자를 손쉽게 제거할 수 있습니다. 배열의 길이가 최대 1,000,000인 경우에도 효율적으로 동작합니다. 문제를 풀면서 알고리즘의 효율성과 Python의 기본 문법을 함께 이해할 수 있는 좋은 예제였습니다.

+ Recent posts