[문자열][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가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱

programmers.co.kr

 


 

 

이해

 

입력

  • 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

jupyter notebook의 실행 결과

  • 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

jupyter notebook의 실행 결과

  • 생각해보니 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.co.kr