본문 바로가기
알고리즘 풀이

[algorithm] 프로그래머스: 중복된 문자 제거

by 째깍단 2023. 4. 24.

답: 

더보기

답1

def solution(my_string):
    answer = ''.join(dict.fromkeys(list(my_string)))
    return answer

fromkeys 함수를 처음 써봤다! dict.fromkeys()로 사용,

key값들을 넣어주면 dict {'a' : None} 형식으로 되돌려준다.

 

 

답2

def solution2(my_string):
    answer = []
    my_string = list(my_string)
    for s in my_string:
        if s not in answer:
            answer.append(s)
    return ''.join(answer)

for문으로 빈 리스트 answer에 더해주고, join함수로  문자열로 출력해준다.

 

 

답3

def solution3(my_string):
    answer = ''
    for s in my_string:
        if s not in answer:
            answer += s
    return answer

for문을 사용해 answer 라는 '' 빈 문자열에 더해준다

문자열이니까 단순히 더하는 것으로 합쳐줄 수 있다! 

 

 

 

 

문제 분석 및 해석

문자열 “my_string”

중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return

 

my_string은 대문자, 소문자, 공백

대문자와 소문자를 구분

공백(" ")도 하나의 문자로 구분

입력 "people”.   "We are the world"

출력 "peol”.   "We arthwold"

 

 

1) 풀이 및 공부

중복제거에 쓸만한 내장함수가 있는지 검색해보니 set, colletions 모듈 등이 나온다.

 

2) 코드 짜보기

 

 

 

 

- 과정1 -    찾은 함수 공부하고 적용 가능한지 생각해보기

 

 

> ‘중복’에 관련한 함수와 모듈 공부

  • set()
    수학에서 말하는 집합과 비슷하고, 집합 안에서 unique한 값을 가진다 (= 자동 중복제거)
     순서가 없어 어떤 값이 먼저나올지 알 수 없다. *

    중괄호를 사용하는 것은 dictionary와 비슷하지만, key가 없고 값만 존재한다
    mutable한 객체이며, iterable한 객체를 넣어주어야한다.

  • set연산자 따로 공부 필요할듯.. 일단 기본
합집합연산자
교집합연산자
차집합 연산자
^  대칭차집합 연산자(합집합-교집합)
|=, &=, -=, ^=   = 과 조합함으로써 연산과 동시에 할당 가능!

 

 

 

  • Collections 모듈!
 from collections import *(보통 여기에 필요한 기능넣어 하나씩 가져다 쓴다)

 

자주쓰는 것 : Counter / Duque / defaultdict

 

  • OrderedDict
    파이썬3.6부터는 dict가 같은 동작을 하게되어 사용할일이 거의 없다.
    하위호환이되었지만 데이터 순서를 보장해줌! + 데이터 순서를 고려해 엄격한 동등성 비교가 가능

 

  • Counter
    중복된 데이터가 저장된 배열을 인자로 넘기면 각 원소가 몇번나오는지 dict로 정리해준다.
    (key = element값, value = element 개수)
    most_common()으로 가장 많이 나온 데이터를 구할 수 있다.

 

 

 

 

> 리스트 중복을 제거하되 기존 리스트의 순서를 유지하고 싶은 경우..

 

  • Python dict 이용
    버전 3.7부터 key값 넣는 순서를 기억해준다.
    .fromkeys 를 이용해 key를 출력할 수 있다

 

  • sorted + set 함수를 함께 사용하기
sorted(set(list), key = lambda x: list.index(x))
#람다로 list index를 참고하도록 해준다.

 

  • OrderedDict 사용

 

  • for 구문 이용
new_list = []
for a in list:
    if a not in new_list:
        new_list.append(x)

 

 

 

 

 

 

 

- 과정2 -   공부한 것을 바탕으로 코드 작성해보기

 

아래 코드들의 모든 입력값은 주어진 예제를 따랐다.

my_string = "people"
my_string2 = "We are the world"

 

 

 

 

시도1.   collections 모듈로 시도

 

-1 Counter를 써보자

from collections import Counter

def solution(my_string):
    answer = Counter(list(my_string))
    print(answer)
    
# 결과 
# Counter({'p': 2, 'e': 2, 'o': 1, 'l': 1})
# Counter({'e': 3, ' ': 3, 'r': 2, 'W': 1, 'a': 1, 't': 1, 'h': 1, 'w': 1, 'o': 1, 'l': 1, 'd': 1})

 

 

Counter 정렬에 대해 찾아본바, sorted로 오름,내림차순정리, key, value 값으로 정리가 있다

문자열의 순서대로 정렬하려면 Counter를 사용하는 것이 적절한 방법이 아닌 듯!

더보기
def solution5(my_string):
    my_string = list(my_string)
    answer = Counter((my_string), key = lambda x: my_string.index(x))

TypeError: unsupported operand type(s) for +: 'function' and 'int'

혹시 적용될까 싶어서 시도해보았지만 오류! 안된다는걸 기억하자

 

 

 

-2 OrderedDict 사용해보기

 

from collections import OrderedDict

def solution0(my_string):
    answer = OrderedDict(list(my_string))
    answer = ''.join(answer.keys())
    return answer

 

될 거 같이 생겼는데 안된다^^.. 왤까..

 

    answer = OrderedDict(list(my_string))
ValueError: need more than 1 value to unpack  라는 오류가 발생. 

 

>>왜 안되는지 알고 싶어..

아하  입력하는 인수가

'key'='value' 이거나  key, value 등, 두 값이 입력되어 있어야한다.

a_list = [[key1=1, key2=2] 

b_list = [(key1, 1), (key2,2)] 

요런 식으로!

 

 

 

 

시도2.  set 함수를 사용해보자

 

def solution(my_string):
    answer = set(list(my_string))
    print(answer)

#결과  {'o', 'p', 'l', ‘e’}. = 중복제거완료, 순서는 매번 바뀜
#{'r', 'h', 'a', 'd', 'l', 'e', ' ', 'W', 't', 'w', 'o'}

 

중복은 제거되는 모습이었지만 출력 결과가 매번 바뀌는 것을 볼 수 있다.

set함수 기본적으로 중복을 제거해주지만 순서가 없기때문에 인덱싱은 불가능하다!

 

 

 

 

 

 

 

시도3.  dict 풀어보자.  fromkeys 사용!

 

def solution(my_string):
    answer = dict.fromkeys(list(my_string))
    print(answer)

# 결과
# {‘p’: None, 'e': None, 'o': None, 'l': None}
# {'W': None, 'e': None, ' ': None, 'a': None, 'r': None, 't': None, 'h': None, 'w': None, 'o': None, 'l': None, 'd': None}

 

fromkeys 를 사용하면 주어진 리스트로 key를 넣어 dict를 생성해준다.

key값은 고유해야하니 중복 제거

value값을 None   = None은 default값.  fromkeys(list넣어주기, 2) 하면 value를 2로 넣어준다.

 

 

그리고 join함수를 사용해 key를 문자열로 출력해주면 된다!

 

def solution(my_string):
    answer = ''.join(dict.fromkeys(list(my_string)))
    return answer

 

 

 

 

 

 

 

시도4. for문 사용하기

 

for문으로 풀이하는 방법에도 2가지가 있는데

하나는 list로 만들어 join 해주는것,  하나는 문자열인 상태로 더해주어 출력해주는 것이다.

 

 

-1  list로 만들어 for문 돌리기

def solution2(my_string):
    answer = []
    my_string = list(my_string)
    for s in my_string:
        if s not in answer:
            answer.append(s)
    return ''.join(answer)

 

 

 

-2  문자열인 상태로 for문 돌리기

def solution3(my_string):
    answer = ''
    for s in my_string:
        if s not in answer:
            answer += s
    return answer

 

 

 


느낀점: 

문자열로 푸는거 아주 새로웠다!

이제 for문 if문은 상당히 익숙해진 느낌이 든다.

 

아직도 모르는게 너무 많아! 더 배워야해!