하루에 하나-2

정인창·2021년 9월 16일
0

코딩테스트 연습

목록 보기
2/19

제목은 하루에 하나지만... 심심할 때 혹은 그냥 하고싶을 때 업로드!
목표가 최소 하루에 하나 입니다!

def solution(strings, n):
    answer = sorted(strings, key = lambda x: x[n])
    
    for i in range(len(answer)-1):
        tmp = answer[i]
        if answer[i][n] == answer[i+1][n]:
            if answer[i] > answer[i+1]:
                answer[i] = answer[i+1]
                answer[i+1] = tmp
    return answer
  • 하나씩 차근차근 구현했습니다
  • 우선 각 문자열의 원소의 n번째 원소로 정렬해야하므로 key에 x의 n번째 원소를 주어 정렬
  • 정렬된 원소를 한 번씩 돌면서 다음 문자열과 n번째 원소가 같다면 둘을 비교해서 앞에 오는게
  • 사전 순서상 더 뒤라면 둘의 교체를 해줬습니다.
  • 이 방법은 만약 n번째 원소가 같은게 1 2 4 5 3 처럼 여러개 있다면
  • 1,2 는 그대로, 2,4도 그대로, 4,5도 그대로, 5와 3만 바뀌어 12435로 정렬되기 때문에
  • 모든 상황을 고려해주지 않아서 아래처럼 100점을 받지 못했습니다. 이걸 다 고려해줘야 함!
def solution(strings, n):
    answer = sorted(strings, key = lambda x: x[n])

    lis = list(map(lambda x: x[n], answer))
    for i in set(lis):
        tmp = []
        for idx, j in enumerate(lis):
            if i == j:
                tmp.append(idx)
        if len(tmp) > 1:
            answer[min(tmp): max(tmp)+1] = sorted(answer[min(tmp): max(tmp)+1])
    return answer
  • 맨 처음 x[n]번째 정렬하는 건 그대로 두고 lis에 n번째 원소들만 리스트로 넣어줍니다.
  • set(lis)를 해서 유니크한 x[n] 원소들로 for문을 돌고
  • i와 j가 같은 경우 즉 x[n]이 같은 것끼리 인덱스를 모아둡니다
  • 어차피 x[n]을 기준으로 정렬되어 있으므로 순서대로 쭉 뽑히게 됩니다.
  • 또한 tmp에 인덱스를 다 모아주고, len(tmp)가 1보다 크다면 x[n]이 같은 문자열이 여러개 있는 것이므로 이런 경우에 sorted를 해서 그 부분만 다시 변경해줍니다. max(tmp)에 +1을 해준 이유는 max(tmp)를 제외하고 슬라이싱 해서 정렬하기 때문
  • 맨 처음에 제대로 정렬되어 있다면 sorted를 괜히 하는 것이므로 효율성이 떨어지지만, 더 좋은 방법이 지금은 생각이 안나네요...
  • sorted를 맨 처음에 하지말고 정렬 코드를 짠다면 더 효율적이지 않을까 싶습니다!
profile
Data science

0개의 댓글