문제 확인

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

나의 풀이

  • 파일명에서 HEAD, NUMBER, TAIL을 구분하기 위해서 GROUP을 활용했다.
필요 없는 0 제거하기
  • int(문자열)을 사용하면, 앞에 있는 필요 없는 "0"을 자동으로 제거해준다. 
  • str.lstrip("0")을 활용할 경우, 숫자 "0"도 제거돼 오류가 발생한다.
GROUPS
  • 해당 GROUP에 패턴을 찾지 못했다면, group[i] 빈칸을 가지고 있다.
    • 찾지 못한 경우를 위해 예외처리를 하지 않아도 된다.
# 파일명에 포함된 숫자를 반영한 정렬 기능 구현
# 숫자 : 0 ~ 99999 -> 숫자 앞의 0은 무시
# 정렬 기준 : 1. HEAD 2.NUMBER 3. 입력 순으로

# NUMBER의 숫자와, Tail의 숫자 구분 필요
import re

def solution(files):
    # (HEAD)(NUMBER)(TAIL) 분리
    pt = r"([^\d]+)(\d+)(.*)"
    # HEAD - NUMBER -TAIL 분리 후 새로운 파일명
    file_splited = []
    for file in files:
        obj = re.search(pt, file)
        file_splited.append([obj.group(1), obj.group(2), obj.group(3)])
    # Number 부분 정렬할 때, int로 변경하지 않으면 10 > 2가 됨
    # int : 앞의 0을 알아서 없애줌
    # str.lstrip("0")은 "0"이 문제 번호인 경우 에러 발생
    file_splited.sort(key = lambda x : (x[0].lower(), int(x[1])))
    file_splited = ["".join(file) for file in file_splited]
    
    return file_splited

다른 사람 풀이

lambda에 함수 전달
  • lambda에 추가로 함수를 활용할 수 있다.
    • 원래 lambda에 순서쌍이 오는거처럼, 함수가 순서쌍을 반환하면 된다.
import re

def solution(files):

    def key_function(fn):
        head,number,tail = re.match(r'([a-z-. ]+)(\d{,5})(.*)',fn).groups()
        return [head,int(number)]

    return sorted(files, key = lambda x: key_function(x.lower()))

 

Number → Head : 문제 조건 만족
import re

def solution(files):
    a = sorted(files, key=lambda file : int(re.findall('\d+', file)[0]))
    b = sorted(a, key=lambda file : re.split('\d+', file.lower())[0])
    return b
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr