[문자열][programmers] 문자열 내 마음대로 정렬하기
Tieck
·2021. 10. 5. 15:22
문제
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
https://programmers.co.kr/learn/courses/30/lessons/12915
이해
입력
- strings : 문자열로 구성된 리스트
- n : 정수
출력
- 각 단어의 인덱스 n으로 오름차순 정렬된 리스트
조건
- strings는 길이 1 이상, 50이하인 배열입니다.
- strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
- strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
- 모든 strings의 원소의 길이는 n보다 큽니다.
- 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
- 사전순 : 첫번째 글자부터 순서대로 오름차순
예시
strings | n | return |
["sun", "bed", "car"] | 1 | ["car", "bed", "sun"] |
["abce", "abcd", "cdx"] | 2 | ["abcd", "abce", "cdx"] |
접근
- 리스트의 길이를 이용하여 list의 요소인 word에 접근
- sorted(key = lambda x : x[i][n])
- n번째 인덱스의 문자가 같을 경우 사전순 정렬 구현
- i = range(len(strings)) 와 n을 제외하는 조건문
n을 제외하기 위해 비교하는 시간복잡도와 그냥 연산해버리는 시간복잡도를 생각해보니, n은 어차피 연산 1회인데 비교하기 위해 O(n)이 필요하다. 조건문에 예외처리 하지 않는 것이 더 빠를 것으로 생각됨
구현
try #1
채점 결과
정확성:
합계: / 100.0
def solution(strings, n):
answer = []
i = range(len(strings))
answer = sorted(strings, key = lambda x : x[i][n],reverse = True)
return answer
- TypeError: string indices must be integers
- i = range(len(strings))에서 문제가 생긴것 같다.
- for 문으로 접근하자.
try #2
채점 결과
정확성:
합계: / 100.0
def solution(strings, n):
answer = []
i = range(len(strings))
answer = sorted(strings, key = lambda x : x[i][n],reverse = True)
return answer
- 생각해보니 sorted의 key는 입력값의 원소에 접근한다. 그러니 for문으로 원소에 접근할 필요 없다.
- sorted의 default는 오름차순이다. reverse = True는 잘못된 코드다.
try #3
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
def solution(strings, n):
answer = []
answer = sorted(strings, key = lambda x : (x[n], x))
return answer
- n으로 우선 정렬하고, 정렬된 결과 내에서 x로 정렬하면 된다!
- range, for문으로 접근하지 말고 주어진 함수 sorted의 용법을 제대로 숙지하자.
코드리뷰
박태영 외 3명
def solution(strings, n):
answer = []
answer = sorted(strings, key = lambda x : x[n]+x[:])
return answer# 풀이
- 문자열 슬라이싱을 이용하는 풀이
- x[:]를 이용하여 x를 복사하여 넣었는데 사용한 메모리의 양이 비슷한 것을 보니, 내 코드 역시 내부적으로 key의 1순위 정렬 -> 복사 해서 다시 정렬하는 것 같다. (반환하지 않고 원본 array를 정렬하는 sort()와 달리) sorted()는 정렬된 array를 반환하는 함수이니 한 번은 복사했을 것이다.
팁
Reference
https://programmers.co.kr/learn/courses/30/lessons/12915/solution_groups?language=python3
'알고리즘' 카테고리의 다른 글
[문자열][programmers]문자열 압축 - 2020 KAKAO BLIND RECRUITMENT (0) | 2021.10.07 |
---|---|
[문자열][programmers]이상한 문자 만들기 (0) | 2021.10.05 |
[문자열][programmers] 문자열 내림차순으로 배치하기 (0) | 2021.10.05 |
[문자열][programmers] 문자열 다루기 기본 (0) | 2021.10.05 |
[로드맵] 코딩테스트 학습 개괄 (0) | 2021.10.04 |