2018 KAKAO BLIND RECRUITMENT 파일명 정리 파이썬
이번 문제는 레벨 2입니다.
접근방식(+오류코드)
- 입력된 files를 각각 head, number, tail로 구분지어 줍니다.
- 이후 sorted의 key값을 이용해서 비교해줍니다.
제 코드는 200/100 점짜리 코드이고, sem님의 velog에서 정답 코드를 가져왔습니다.
오답 풀이(TC 1, 2만 통과)
import re
def solution(files):
answer = []
# head_list = []
# number_list = []
# tail_list = []
d = []
num_ind = 0
tail_ind = 0
for i in files:
for j in range(len(i)):
if i[j].isnumeric() and re.match('[. '']+',i[j+1]) is not None:
tail = i[j+1:]
# print(i[:j+1])
for s in range(len(i[:j+1])):
if i[:j+1][s].isnumeric():
# print(s)
head, number = i[:j+1][:s], i[:j+1][s:]
# print(head, number, tail)
# num_ind += s
# tail_ind += (j+1)
# print(num_ind, tail_ind)
d.append((head, number, tail))
break
# print(sorted(d, key=lambda x: x))
check = []
# print(d)
for i in range(len(d)):
check.append(d[i][0].lower())
if len(set(check)) == 1:
sorted_d = sorted(d, key=lambda x: int(x[1].lstrip('0')))
for k in range(len(sorted_d)):
answer.append(''.join(sorted_d[k][j] for j in range(3)))
return answer
else:
sorted_d = sorted(d, key=lambda x: x[0])
# print(sorted_d)
answer.append(sorted_d[0])
# answer.append(''.join(sorted_d[0][i] for i in range(3)))
for i in range(1, len(sorted_d)):
if sorted_d[i][0].lower() == sorted_d[0][0].lower() and int(sorted_d[i][1].lstrip('0')) < int(sorted_d[0][1].lstrip('0')):
answer[0].append(sorted_d[i])
else:
answer.append(sorted_d[i])
for i in range(len(answer)):
answer[i] = ''.join(answer[i][j] for j in range(3))
return answer
아래는 sem님의 velog 코드입니다.
모범코드
def solution(files):
tmp = []
head, number, tail = '', '', ''
for file in files:
for i in range(len(file)):
if file[i].isdigit(): # 숫자가 나오면 그 이전은 무조건 HEAD, 이후는 NUMBER, TAIL로 다시 구분
head = file[:i]
number = file[i:]
for j in range(len(number)): # NUMBER와 TAIL 구분 (숫자 안나오면 TAIL)
if not number[j].isdigit():
tail = number[j:]
number = number[:j]
break
tmp.append([head, number, tail])
head, number, tail = '', '', ''
break
tmp = sorted(tmp, key=lambda x:(x[0].lower(), int(x[1])))
return [''.join(i) for i in tmp]
프로그래머스 모범 답안 중 3줄 짜리 답도 있었는데 그 보다도
이 코드가 좀 더 흐름을 이해하는 것에 도움이 되는 것 같아 분석하게 되었습니다.
isdigit()
을 이용해서 숫자가 등장하기 전까지 head 그 이후를 number와 tail로 구분할 수 있게 한 점이 좋습니다.
마지막에 sorted함수를 이용하면서 key값에 2개의 조건을 한번에 넣어서 정렬을 수행했는데
이렇게 한번에 연속되는 조건을 넣을 수 있다는 것을 처음 알게 되었습니다.
알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.
Just do it & Keep steady
댓글남기기