첫 번째 문제
파일명 정렬
@카카오 코딩테스트 3차
문제를 요약하자면, 파일명을 HEAD
, NUMBER
, TAIL
세 구간으로 나누고 HEAD
순으로 정렬하고 같을 시 NUMBER
순으로 정렬하는 것이다.
나는,
각각 정렬하는 것이 아니라 한방에 정렬 하고 싶었다. 그렇기에 HEAD
와 NUMBER
의 문자열 사이즈를 맞춰서 합쳐서 정렬해야 했다. HEAD
는 뒷부분에 스페이스를 붙이고, NUMBER
는 앞부분에 0
을 붙여서 구현하여 했다. 하지만, 20개의 테스트 중 16개만 성공하였다.
["AF-010", "A-1", "GDD-0003"]
➡ ["AF- 0010", "A- 0001", "GDD-0003"]
예외 4가지가 왜 발생하는지 알아내지 못했다
물론 문자열 뒤에 스페이스를 더한 것이 의심갔다. 하지만 찾아봐도 아니었다.
위 사진을 보면, 다음과 같은 순서로 정렬된다고 나와 있다. 문제에서 정의한 사전 순 정렬이 사실 정확히 어떤 순서인지 몰라서 찾아본 것이다. 그래서 찾은 결과 문자 및 특수 기호는 Whitespace보다 뒤로 정렬되기에 더욱 고민에 빠졌다.
Space가 제일 앞이잖아!
하지만, 이때 그냥 "A"
와 "A "
가 같은 순서로 취급된다는 문제를 알게 되었다.
그래서 직접 해보니 위에서 찾아본 것과 아예 달랐다.
해결법
HEAD
문자 부분에"!"
를 뒤에 추가하고," "
를"#"
로 변환한다.ASCII 순서 바탕으로
내 코드
import re
def solution(files):
answer = []
HEAD = {}
NUMBER = {}
p = re.compile("[0-9]{1,5}")
for i, file in enumerate(files):
s = p.search(file)
HEAD[i] = file[:s.start()].lower()
NUMBER[i] = file[s.start():s.end()]
max_HEAD_len = max([len(i) for i in HEAD.values()])
max_NUMBER_len = max([len(i) for i in NUMBER.values()])
result = {}
for i in range(len(files)):
result[i] = HEAD[i]
for j in range(max_HEAD_len - len(HEAD[i])):
result[i] += "!"
result[i] = result[i].replace(" ", "#")
for i in range(len(files)):
for j in range(max_NUMBER_len - len(NUMBER[i])):
result[i] += "0"
result[i] += NUMBER[i]
result = [ i[0] for i in sorted(result.items(), key=lambda t : t[1])]
print(result)
for i in result:
answer.append(files[i])
return answer
인터넷에서 찾은 개쩌는 코드
import re
def solution(files):
# 1
temp = [re.split(r"([0-9]+)", s) for s in files]
# 2
sort = sorted(temp, key = lambda x: (x[0].lower(), int(x[1])))
# 3
return ["".join(s) for s in sort]
re.split()
인자 내 정규식에서()
가 있고 없고 따라 결과가 다르다.
REF 더 읽어보겠습니다. Python님.
끝