알고리즘/programmers

[programmers] [3차] 파일명 정렬 / 2018 KAKAO BLIND RECRUITMENT / 파이썬

seohmoon 2022. 11. 16. 19:13

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/17686#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

1) 요구사항 분석 : 문제 읽기

파일명 정렬

 

2) 설계 : 접근 방식

1.files 배열을 순회하면서 각각의 file을 head와 num으로 나눠주는 함수에 넣음 -> def headNum

 

2. def headNum 함수에서는 리턴으로 head 와 num을 넘겨줌

2-1 우선 숫자인지 판별!

그리고 5까지만ㅇㅇ(문제에서 주어진 조건)

2-2 숫자가 아닐때,

넘버가 비어있으면 아직 헤드인 상황이니까 헤드에 += 해주기

넘버가 비어있지 않으면 이미 헤드, 넘버까지 다 찾은 상태고, 그 다음인 테일이 되니까 반복문 종료!! 

2-3 헤드는 전부 소문자로 바꿔줌 -> 문자열.lower()

num은 위에서 str형식으로 받았으니까 int로 바꿔줌

 

3. 다시 원래로 돌아와서, 리스트에

[원래의 값, 위에서 넘겨받은 헤드, 넘버,  인덱스] 를 추가해줌

 

4. 여러가지 조건에 따라 순서대로 정렬해줘야하니까 lambda 사용

lst.sort(key=lambda x:(x[1], x[2], x[3]))

 

5. lst를 for문 돌면서 정답 리스트에 추가해주기

 

def solution(files):
    answer = []
    lst = [] # 리스트 안에 리스트로 담아줌
    
    def headNum(x):
        head = ""
        num = ""
        
        for i in range(len(x)):
            if str(0) <= x[i] <= str(9): # 숫자인지 판별
                if len(num) < 5:
                    num += x[i]
            else: # 숫자가 아닐 때
                if num == "": # 아직 넘버가 비어있으면 헤드!
                    head += x[i]
                else : # 이거 꼭 해주기!! 넘버가 이미 존재하니까 테일임!!!!
                    break
        head = head.lower()
        num = int(num)
        # print(head, num)
        return (head, num)
    
    for i in range(len(files)):
        head, num = headNum(files[i])
        lst.append([files[i], head, num, i]) # 원래이름, 헤드, 넘버, 인덱스
  
    lst.sort(key=lambda x:(x[1], x[2], x[3]))

    for file in lst:
        answer.append(file[0])
        
    return answer