2/프로그래머스

프로그래머스 연습 문제 - 파일명 정렬

하례은 2020. 10. 20. 13:18

programmers.co.kr/learn/courses/30/lessons/17686

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램��

programmers.co.kr

level2

 

 

1차

def solution(files):
    answer = []
    HEAD , TAIL= head(files)
    NUMBERS = numbers(TAIL)

    for i in range(1,len(files)-1):
        for j in range(1,len(files)-i):
            if HEAD[j-1].lower() > HEAD[j].lower():
                HEAD[j-1], HEAD[j] = HEAD[j],HEAD[j-1]
                NUMBERS[j-1], NUMBERS[j] = NUMBERS[j],NUMBERS[j-1]
                TAIL[j-1],TAIL[j] = TAIL[j],TAIL[j-1]

    for i in range(len(files)-1):
        hindex = 0
        index = 0
        for j in range(i+1,len(files)):
            if HEAD[i].lower() != HEAD[j].lower():
                break
            elif HEAD[i].lower() == HEAD[j].lower():
                hindex = i
                index = j

        if index != 0:
            for i in range(hindex+1, index):
                for j in range(hindex+1, index-i+2):
                    if int(NUMBERS[j-1]) > int(NUMBERS[j]):
                        HEAD[j-1], HEAD[j] = HEAD[j],HEAD[j-1]
                        NUMBERS[j-1], NUMBERS[j] = NUMBERS[j],NUMBERS[j-1]
                        TAIL[j-1],TAIL[j] = TAIL[j],TAIL[j-1]

        if index == len(files)-1:
            break

    for i in range(len(files)):
        answer.append(HEAD[i] + NUMBERS[i] + TAIL[i]) 
    
    
    return answer

def head(files):
    HEAD = []
    TAIL = []
    for i in range(len(files)):
        for j in range(len(files[i])):
            if files[i][j].isdigit() == True:
                HEAD.append(files[i][:j])
                TAIL.append(files[i][j:])
                break
    
    return HEAD,TAIL

def numbers(TAIL):
    NUMBERS = []
    for i in range(len(TAIL)):
        for j in range(len(TAIL[i])):
            if TAIL[i][j].isdigit() == False:
                NUMBERS.append(TAIL[i][:j])
                TAIL[i] = TAIL[i][j:]
                break
    return NUMBERS


files =  ["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"]
print(solution(files))

채점 결과

정확성: 20.0

합계: 20.0 / 100.0

 

테케는 다 맞는데 시간 오류로 다 틀리능..버블정렬으로 했더니 넘 오래걸려서 그런가보다... 틀릴줄알았다 ㅋㅎ

질문하기 보니 sort()를 쓰는거같은데... 

 

 

2차

def solution(files):
    answer = []
    result = []
    for i in range(len(files)):
        result.append(cut(files[i]))
    sort = sorted(result,key = lambda x: (x[0].lower(), int(x[1])))

    return [''.join(s) for s in sort]

def cut(word):
    head = 0
    num = 0
    tail = 0
    for i in range(len(word)):
        if word[i].isdigit() == True:
            head = word[:i]
            tail = word[i:]
            break

    for i in range(len(tail)):
        if tail[i].isdigit() == False:
            num = tail[:i]
            tail = tail[i:]
            break

    return [head,num,tail]

채점 결과

정확성: 25.0

합계: 25.0 / 100.0

 

 

3차

import re
def solution(files):

    result = [re.split(r"([0-9]+)",s) for s in files]
    sort = sorted(result,key = lambda x: (x[0].lower(), int(x[1])))

    return [''.join(s) for s in sort]

결국 다른분들껄 참고해서 풀었다...
정규화를 쓰면 훨신 간단해지고 빨라진다..
오늘도 하나 배웠다... 정규화 공부 좀 해야겠다..