6장 문자열 조작 - 4,5,6

·2021년 1월 17일
0

Python

목록 보기
3/7

가장 흔한 단어

풀이
1. 리스트 컴프리헨션, counter 객체

리스트에서 자주 사용되는 기법( 비단, 리스트만은 아니긴 합니다. )으로 문자열에서 필요한 부분(데이터)만 추출. 즉, 데이터 클렌징이라 불리는 전처리 작업이 필요하다.

사고과정

문제를 보고
금지된 단어를 제외한 = 금지된 단어에 대해 in을 사용하자.
가장 흔하게 = 단어를 key로 개수를 세야겟다. 단어를 key로 잡고 value를 개수로 하면 될까?
대소문자 구분을 하지 않으며 = lower로 모두 소문자로 만들자.
구두점을 무시한다 = 단어가 아닌 다른 값들은 모두 사라지게 하자.
적어도 이런 식으로는 생각해야 한다.

여기서 참 맛깔나게 이용했다 싶은 부분은 구두점과 같은 부분을 바로 없애게끔 if문을 사용한다던가 하는게 아니라 정규표현식을 사용해서 문자열에서 이런 부분만 " ", 공백으로 바꾼뒤 split() 함수를 이용하여 제거시킨 부분이다.


그룹 에너그램

풀이
1. 정렬하여 딕셔너리에 추가

사고과정

애너그램 단위로 그룹핑 = 애너그램, 문자열의 문자들은 모두 동일. set? list?
set을 쓰면 문자들은 동일하지만 개수가 다를 경우 달라져서 안됨. list를 써야겠다.
list로 만든뒤 이걸 다시 문자열로 만들고 이걸 key 삼아 dictionary를 사용해야겠다. 근데 다른 단어들에 대해서도 모두 같은 key로 만들어야 하는데...sorted를 사용하자!
그러면 for문을 이용해서 매 요소들을 참조하는데, 이 때 dictionary에 해당 key가 없다면 어떡하지? if문을 사용해서 dictionary에 추가해야하나?

for word in words :
	if word in dic :
    	dic["".join(sorted(word))].append(word)
    else :
    	dic["".join(sorted(word))]=[word]

이렇게 짤텐데, 우리는 defaultdict라는 걸 배웠다. dictionry 자료형에 보고자 하는 key가 없다면 해당 자료형에 대한 default값을 초기값으로 key와 value가 생성된다.
따라서,

dic = collections.defaultdict(list)

for word in words :
	if word in dic :
    	dic["".join(sorted(word))].append(word)

위와 동일하다.

*문자열에 대한 sorted 함수는 자동으로 리스트화 해준다.
*sorted에 대해 key값을 부여함으로써 원하는 조건대로 정렬가능
  • 재풀이
  1. [dic[i] for i in dic.keys()] == dic.values()

    dictionary에서 key리스트를 얻고 싶다면 dictionary.keys() value만 얻고 싶다면 dictionary.values(). 둘다 리스트 형식으로 반환

  2. ''.join(sorted(s)) 주어진 문자열을 정렬한뒤 바로 다시 문자열로 전환. 동일한 요소들을 가지는 value들에 대한 key를 이걸로 삼는다.

가장 긴 팰린드롬 부분 문자열

풀이
1. 중앙을 중심으로 확장하는 풀이

사고과정

profile
세상은 너무나도 커

0개의 댓글