https://school.programmers.co.kr/learn/courses/30/lessons/17686
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
import re
def solution(files):
for i in range(len(files)):
file = files[i]
numbers= re.findall('\d+', file)
number = numbers[0]
s = file.index(number)
e = len(number)
split_file = [file[:s], file[s:s+e], file[s+e:]]
files[i] = split_file
files = sorted(files, key=lambda x : [x[0].lower(), int(x[1])])
result = [''.join(file) for file in files]
return result
주어진 file
들을 HEAD
, NUMBER
, TAIL
로 분리하기 위하여 먼저 file
에 포함된 숫자(NUMBER
)를 찾아내는 작업을 진행했습니다.
re
라이브러리의 findall('\d+', file)
함수로 숫자를 찾아내었습니다.
이때 찾아낸 숫자가 여러개라면 가장 먼저 등장하는 숫자를 이용해야 합니다 따라서 numbers[0]
을 number
로 저장합니다.
다음은 file.index()
함수를 사용하여 number
의 위치를 찾아냅니다 index()
함수는 동일한 숫자가 조회할 경우 가장 앞에 있는 숫자의 시작위치를 찾게 됩니다.
예를 들어 주어진 입력이 file
: foo020bar020.zip 와 같다면number
는 앞에 있는 020
이 됩니다. 이때 020
은 foo 오른쪽, bar 오른쪽 두 군데 존재하지만 index()
는 foo 오른쪽에 있는 3을 반환합니다.
숫자의 시작 위치를 s
와 number
의 길이 e
를 이용하여 HEAD
, NUMBER
, TAIL
을 분리합니다.
문제의 정렬 기준을 확인해보겠습니다.
- 파일명은 우선 HEAD 부분을 기준으로 사전 순으로 정렬한다. 이때, 문자열 비교 시 대소문자 구분을 하지 않는다.
- 파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다. 9 < 10 < 0011 < 012 < 13 < 014 순으로 정렬된다. 숫자 앞의 0은 무시되며, 012와 12는 정렬 시에 같은 같은 값으로 처리된다.
- 두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다.
sorted()
함수에서 위의 정렬기준을 만족하는 것을 확인할 수 있습니다.
정렬시킨 files
를 다시 모아주는 작업을 진행한뒤 결과를 반환합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 예상 대진표 파이썬(Python) (1) | 2023.03.20 |
---|---|
[코딩테스트] 백준 차이를 최대로 파이썬(Python) (0) | 2023.03.18 |
[코딩테스트] 프로그래머스 땅따먹기 파이썬(Python) (0) | 2023.03.16 |
[코딩테스트] 프로그래머스 조건에 맞는 사용자 정보 조회하기 MySQL (0) | 2023.03.14 |
[코딩테스트] 프로그래머스 조건에 맞는 사용자와 총 거래금액 조회하기 MySQL (0) | 2023.03.13 |