본문 바로가기

TIL

[240326] 파이썬: 코드카타 47 & SQL: 코드카타 165

[파이썬 코드카타]

문자열 내 마음대로 정렬하기

https://school.programmers.co.kr/learn/courses/30/lessons/12915

 

1) 어떤 문제가 있었나

리스트에 포함된 문자열의 인덱스 n번째 음절 순서대로 정렬하는 문제 

[예시]

strings = ["sun", "bed", "car"]
n = 1 

result = ["car", "bed", "sun"]

 

2) 내가 시도해본 건 무엇인가

- 인덱스 n번째 음절을 key 값으로, 문자열을 value 값으로 넣은 딕셔너리 생성 {'u': 'sun', 'e': 'bed', 'a': 'car'}

- key 값 기준으로 정렬하고 value 값 리스트 출력

- 인덱스 n번째 음절이 같을 경우(중복), 딕셔너리 key 값이 마지막 값으로 덮여져서 실패 (딕셔너리 키 값은 중복 안 됨)

# 실패
answer = {}
for i in strings:
    answer[i[n]] = i   # {'u': 'sun', 'e': 'bed', 'a': 'car'}
sort_answer = sorted(answer.items())  #key값 기준으로 정렬 # [('a', 'car'), ('e', 'bed'), ('u', 'sun')]
answer = []
for j in range(len(strings)):
    answer.append(sort_answer[j][1])
answer

 

3) 어떻게 해결했나

- 리스트에 인덱스 n번째 음절과 전체 단어가 담긴 리스트를 넣은 뒤, 마지막에 각 리스트에 2번째 자리에 있는 전체 단어 반환 

# strings = ["abce", "abcd", "cdx"]	
# n = 2 

def solution(strings, n):
    list = []
    answer = []
    for a in strings:
        list.append([a[n], a])
        list.sort() # [['c', 'abcd'], ['c', 'abce'], ['x', 'cdx']]

    for b in list:
        answer.append(b[1])
    return answer # ['abcd', 'abce', 'cdx']

 

4) 무엇을 새롭게 알았나

- 딕셔너리 사용 시 주의사항

① 사용 가능 자료형 - int, tuple, float, bool / 사용 불가능 자료 - set, list, dict 

② 키값이 중복되면 마지막 값으로 덮어씌어짐

③ 순서가 없어서 인덱스 사용 불가

# 다른 사람 풀이 01
# sorted에 key 파라미터를 넣으면 key 기준으로 정렬
def strange_sort(strings, n):
    '''strings의 문자열들을 n번째 글자를 기준으로 정렬해서 return하세요'''
    return sorted(strings, key=lambda x: x[n])
    
# 다른 사람 풀이 02
# a~z까지 순서대로 문자열을 만든 뒤에, 하나씩 꺼내서 앞에 위치하면 단어를 리스트에 넣음 
def strange_sort(strings, n):
    lst = []
    for i in "abcdefghijklmnopqrstuvwxyz":
        for j in strings:
            if j[n] == i: lst.append(j)
    return lst