답:
답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문은 상당히 익숙해진 느낌이 든다.
아직도 모르는게 너무 많아! 더 배워야해!
'알고리즘 풀이' 카테고리의 다른 글
[algorithm] 페어 - 프로그래머스: 영어가 싫어요 (0) | 2023.04.26 |
---|---|
[algorithm] 페어 - 프로그래머스: 로그인 성공?, n의 배수 고르기 (0) | 2023.04.25 |
[TIL] 알고리즘: 소수 찾기 공부 (2) | 2023.04.22 |
[algorithm] 프로그래머스:입문 로그인 성공? (0) | 2023.04.21 |
[algorithm] 백준: 3003 킹, 퀸, 룩, 비숍, 나이트, 폰 (4) | 2023.04.20 |