본문 바로가기
파이썬/코딩테스트

[파이썬]코딩테스트 04 정렬_기본정리

by nemonemonemo 2025. 8. 5.

정렬

  • 코테용 vs 실제 대면 면접 → 기본적인 내용들과 차이점이 있음
    • 코테용
      • 정렬 관련 개별 알고리즘이 주된 내용은 아님
      • 정렬만 내는 문제는 거의 없음 → 마지막에 출력을 할 때…사용됨 (~하게 정렬하시오) → 아니면 중간에 처리할 때 1 ~2줄 정리
      • 핵심
        • 내가 원하는대로 정렬 규칙 세팅
        • 필요한 자료형 구성/ 설정 할 수 있어야
        • ⇒ 정렬을 하기 위한 필요한 정보들을 어떻게 세팅할 것인가를 연결해서 봐야함
    • 실제 대면 면접
      • 기본적인 정렬 알고리즘 차이점을 묻거나 OR 코드로 구현하라고 함
        • 파이썬 구현 10줄 내외이기도 하고
        • for/ index/ 규칙 : 코드 작성에 있어서 기본기를 파악하기 용이함
        • 알고리즘 효율성/ 특징 등 여러가지 물어볼 수 있어서 물어봤음

  • 코테 상에서 정렬에 대한 알고리즘 중요하지 X ⇒ 대신 문제에서 제시한 기준대로 정렬할 수 있도록 코드화하는 것이 중요함
  • 파이썬을 가지고 정렬하는 기본적인 기능
  • 파이썬을 가지고 정렬을 하는 경우가 2가지 있음
    • 1)리스트.sort() 메서드
      • 원본이 날라감
    • 2)파이썬 자체 sorted() 함수
      • 리스트 내에 내장되어있는 것 아니다보니
      • 원본 그대로 유지
      • 번거로운 점: 변경된 결과가 필요하면 따로 저장 or 할당 해야함
    • ⇒ 공통점 : 사용방식은 동일함
    • 중요한 점
      • 위의 2가지 방식을 사용할 때 → 문제에서 요구하느 대로 정렬 기준 작성
      • 특별한 정렬 기준에 대해서 → lambda 함수를 사용해서 정렬 규칙을 기술해야함
        • 코테에서는 문제 상황, 조건이 다양함, 연습해야함
        • 이러한 정렬을 하기 위해서 편한 자료형…값, 주어진 문제들을 풀면서 어떻게 세팅할 것인가 고민해봐야함

  • 정렬
    • 기준을 가지고 그 기준에 맞춰서 “순서를 정리”
      • 기준 : 위치, 값의 크기, 알파벳, 문자순, 성적순…
    • 참고) 단순 순서상 재배치 : reverse() 메서드, reversed() 함수
      • 주의* : 값의 크기 기준X, 단순 위치가 기준인 경우를 역순해


  • 값을 기준으로 정렬 : sort() 메서드, sorted()함수 → 수업진행상 원본 유지하는 sorted()를 주로 사용할 것

    • option) 값에 대한 정렬 기준 → 오름/내림차순
      • reverse = False : 오름차순 → Default
      • reverse = True : 내림차순 ⇒ FM적으로 오름/내림차순 지정하는 방식


  • 정리
    • 포지션 중심으로 뒤집기 : .reverse() 메서드, reversed()함수
    • 기준을 가지고 정렬 오름/내림차순 옵션 지정 : reverse 파라미터 T/F : .sort()메서드, sored()함수
    • ** 목적 : 내가 원하는 정렬 기준을 만들어서 하자!!! ******

  • 수업 진행을 위해서,,원본을 유지하는 sorted만
    • 원하는 기준들을 작성해서 표현: lambda 함수 작성
      • ex) 앞글자 1개만 가지고 정렬 → 그 외에 글자들은 신경 안 씀(그냥 원본 순서대로 유지)
        sorted(str_list, key = lambda x:x[0])
      • ex) 특이하게 글자 2번째에 있는 글자 1개만 가지고 정렬 → 그 외에 위치의 글자들은 상관없음(원본 순서대로) ⇒ 내가 직접 기준을 명시
        sorted(str_list, key = lambda x:x[1])
      • ex) 글자 길이를 순서대로 정렬하시오 → 특별 기준이므로, 내가 직접 만들어야함
        sorted(str_list, key = lambda x:len(x))
      • ex) 글자 길이 역순대로 정렬하시오(FM적인 방식)
        sorted(str_list, key = lambda x:len(x), reverse = True)
        ​

      • 기준에 대해서 방향성 오름/내림 → FM적: reverse 파라미터 T/F
      • AM적으로는 간단하게 부호 +/- → 조건이 여러개가 있는 경우에 대해서 각 조건별로 방향이 다를 때
        ⇒ 조건에 대한 개별 방향성을 표현하기 위한 방법
        #FM
        sorted(str_list, key = lambda x:len(x), reverse = True)
        
        #AM
        sorted(str_list, key = lambda x:+len(x))
        
        #FM
        sorted(str_list, key =lambda x: len(x) ,reverse=True) 
        
        #AM
        sorted(str_list, key =lambda x: -len(x)) 
        ​

  • 구체적인 예시
    • 이름, 성적에 대한 자료형에 대한 정렬
    • 그냥 정렬해줘
    • 정렬 기준 : 이름 중심으로 정렬해라
      sorted(zumsu_list, key = lambda x : x[0])
      ​
    • 정렬 기준: 성적순으로 정렬해라
      sorted(zumsu_list, key = lambda x : x[1])
      ​
      • 내가 기준을 지정하지 않은 상황에 대해서 앞의 기준에서 동일한 순서가 발생
        • 여기서는 5점에 대한 것
        • 원본의 순서를 유지함!!!
    • 성적이 제일 높은 친구들은 앞에 먼저 보고싶다
      • 성적 & 내림차순
      • 방향성에 대한 지정
        • FM → reverse = T/F
          sorted(zumsu_list, key = lambda x : x[1], reverse=True)
          ​
        • AM → +/-
          sorted(zumsu_list, key = lambda x : -x[1])
          ​

  • 예) 조금 더 유사한 값들이 있는 경우로 세팅 (이름 - 성적)
    • 그냥 정렬
      • 결과
        • 이름 순서대로 오름차순 정렬 → 사전순
        • 이름이 같다면? 뒤의 값(성적)을 기으로 오름차순
        • ⇒ 기준대로 순서대로 오름차순 일괄 적용


  • 예) 정렬 기준
    • 정렬1기준 → 이름 순서 (사전순 : 오름차순)
    • 정렬 1 기준이 같다면 (동명이인), 그냥 원본 순서대로
      sorted(zumsu_list, key = lambda x : x[0])
      ​

⇒ 코드적으로 정렬 기준에 안 쓰면 → 원본 순서를 유지함


  • 예) 아무것도 안 한 sorted()와 동일하게 sorted(zumsu_list) 결과와 동일하게 나오도록 key, lambda를 설정
    • 1번 정렬기준 : 이름(오름차순)
    • 2번 정렬기준: 성적(오름차순)
    • ==> lambda로 기술!!!
      sorted(zumsu_list, key=lambda x:(x[0], x[1]) )
      ​

  • 보통 코테에서는 혼재된 방향성을 제시하는 경우들이 종종 있음
    • 1정렬 기준 : 이름(오름차순: 사전 순)
    • 2정렬 기준 : 성적(내림차순)
    • 1,2 기준 모두 동일하면 원본 순서대로
      sorted(zumsu_list, key=lambda x:(x[0], -x[1]) )
      ​
    • + 얘는 둘다 역방향