2018 KAKAO BLIND RECRUITMENT 파일명 정리 파이썬

1 분 소요

2018 KAKAO BLIND RECRUITMENT 파일명 정리 파이썬 풀이

이번 문제는 레벨 2입니다.

접근방식(+오류코드)

  1. 입력된 files를 각각 head, number, tail로 구분지어 줍니다.
  2. 이후 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

댓글남기기