문제풀이/일일연습문제

[스택/큐]99클럽 코테 스터디 15일차 TIL + 프로그래머스/1/12906. 같은 숫자는 싫어

Mo_bi!e 2024. 11. 12. 10:35

같은 숫자는 싫어 - 문제 12906

문제 링크

성능 요약

메모리: 27.9 MB, 시간: 57.70 ms

구분

코딩테스트 연습 > 스택/큐

채점 결과

정확성: 71.9
효율성: 28.1
합계: 100.0 / 100.0

제출 일자

2024년 11월 12일 10:32:20

문제 설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

제한사항

  • 배열 arr의 크기 : 1,000,000 이하의 자연수
  • 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

입출력 예

arr answer
[1,1,3,3,0,1,1] [1,3,0,1]
[4,4,4,3,3] [4,3]

입출력 예 설명

입출력 예 #1,2
문제의 예시와 같습니다.

 

<내 코드>

 

 

<모범 사례>

 

- groupby 이용

from itertools import groupby

def solution(arr):
    return [key for key, _ in groupby(arr)]

 

- 내 코드 개선

def solution(arr):
    answer = []
    for a in arr:
        if not answer or answer[-1] != a:
            answer.append(a)
    return answer

 

<보충 학습>

- 파이썬 'groupby'

 

from itertools import groupby

groupby(iterable, key = None)

# iterable : list, tuple 같은 데이터
# key 는 그룹화 할 기준 지정하는 함수

groupby 는 연속된 요소 있을 때 그룹형성함 

 

 

실제 예

from itertools import groupby

data = [1, 1, 2, 2, 1, 1, 3]
grouped_data = groupby(data)

# 그룹을 출력
for key, group in grouped_data:
    print(key, list(group))
    
# 1 [1, 1]
# 2 [2, 2]
# 1 [1, 1]
# 3 [3]

key, group 로 나오게 가능

 

딕셔너리의 경우 key 로 그룹화 가능

from itertools import groupby

# 예제 데이터: 점수를 가진 학생 리스트
students = [
    {"name": "Alice", "score": 90},
    {"name": "Bob", "score": 85},
    {"name": "Charlie", "score": 90},
    {"name": "David", "score": 85}
]

# 점수(score)를 기준으로 그룹화
grouped_by_score = groupby(students, key=lambda x: x["score"])

# 그룹화 결과 출력
for score, group in grouped_by_score:
    print(score, list(group))
90 [{'name': 'Alice', 'score': 90}, {'name': 'Charlie', 'score': 90}]
85 [{'name': 'Bob', 'score': 85}, {'name': 'David', 'score': 85}]