[PROG] 17677 뉴스 클러스터링(append, extend, insert)

호호빵·2022년 10월 6일
0

Algorithm

목록 보기
31/46

문제

https://school.programmers.co.kr/learn/courses/30/lessons/17677?language=python3#

나의 풀이

- str이 정규식을 만족하면 리스트에 추가
- 두 리스트에 공통으로 있는 원소는 same 리스트에 추가하고 list_2에서 제거
- list_2에서 공통 부분이 모두 제거 되었으므로 list_1에 있는 원소를 list_2에 모두 넣어주면 합집합이 됨
- 교집합, 합집합 모두 공집합이거나, 교집합이 없으면 1 * 65536 반환
import re

def solution(str1, str2):

    str1 = str1.lower()			# 소문자로 변경
    str2 = str2.lower()

    list_1 = []					# 두 글자씩으로 담을 리스트
    list_2 = []

    same = []					# 교집합 리스트

    for i in range(len(str1) - 1):
        str = str1[i] + str1[i+1]

        if re.match("[a-z]", str[0]) and re.match("[a-z]", str[1]):
            list_1.append(str)

    for i in range(len(str2) - 1):
        str = str2[i] + str2[i+1]

        if re.match("[a-z]", str[0]) and re.match("[a-z]", str[1]):
            list_2.append(str)


    for i in list_1:
        for j in list_2:
            if i == j:
                same.append(i)
                list_2.remove(j)
                break

    for i in list_1:
            list_2.append(i)


    if list_2:
        answer = int((len(same) / len(list_2)) * 65536)
    else:
        answer = 65536

    return answer
    
  • 결론적으로 정답 처리가 되었긴 했지만 코드 수정이 필요할 것 같았음

코드 개선 및 다른 풀이

코드 개선

i)  str1 = str1.lower()
    str2 = str2.lower()

    list_1 = []
    list_2 = []

   for i in range(len(str1) - 1):
        str = str1[i] + str1[i+1]

        if re.match("[a-z]", str[0]) and re.match("[a-z]", str[1]):
            list_1.append(str)

    for i in range(len(str2) - 1):
        str = str2[i] + str2[i+1]

        if re.match("[a-z]", str[0]) and re.match("[a-z]", str[1]):
            list_2.append(str)
            
            
-> 이렇게 개선

	list1 = [str1[n:n+2].lower() for n in range(len(str1)-1) if str1[n:n+2].isalpha()]
    list2 = [str2[n:n+2].lower() for n in range(len(str2)-1) if str2[n:n+2].isalpha()]
             

최종 풀이

def solution(str1, str2):

    list1 = [str1[n:n+2].lower() for n in range(len(str1)-1) if str1[n:n+2].isalpha()]
    list2 = [str2[n:n+2].lower() for n in range(len(str2)-1) if str2[n:n+2].isalpha()]

    tlist = set(list1) | set(list2)  # 중복된 원소를 제거한 합집합
    res1 = [] 		# 교집합
    res2 = [] 		# 합집합

    if tlist:
        for i in tlist:
            res1.extend([i]*min(list1.count(i), list2.count(i)))  # 가장 작은 횟수의 개수만큼 리스트에 추가
            res2.extend([i]*max(list1.count(i), list2.count(i)))  # 가장 많은 횟수의 개수만큼 리스트에 추가

        answer = int(len(res2)/len(res1)*65536)
        return answer

    else:
        return 65536


list의 append, extend, insert

-python에서 원소를 추가하는 방법은 여러가지가 있다.

  • append(x)
  • extend(iterable)
  • insert(i, x) : i 위치에 x를 추가

append(x)

  • 리스트 끝에 x 1개를 그대로 넣음

extend(iterable)

  • 리스트 끝에 가장 바깥쪽 iterable의 모든 항목을 넣음
# 일반적인 경우
x = ['A', 'B', 'C']
y = ['D', 'E']

i) x.append(y)   -> x = ['A', 'B', 'C', ['D', 'E']]
ii) x. extend(y) -> x = ['A', 'B', 'C', 'D', 'E']


# y가 문자열인 경우
x = ['A', 'B', 'C']
y = 'DEF'

i) x.append(y)   -> x = ['A', 'B', 'C', 'DEF']
ii) x. extend(y) -> x = ['A', 'B', 'C', 'D', 'E', 'F']


extend()

profile
하루에 한 개념씩

1개의 댓글

comment-user-thumbnail
2022년 10월 11일

김밥집 사장님 김밥 너무 잘 먹었어요~ 맛있었어요! 감사합니다.

답글 달기