🔗 Problem Link

 

프로그래머스

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

programmers.co.kr


❔Thinking

  • 파일명을 주어진 조건에 따라 정렬한다.
    • HEAD는 한 글자 이상의 문자로 이루어져있고, (" ", ".", "-") 가 가능하다.
    • NUMBER는 한 글자 이상 다섯 글자 이하의 연속된 숫자이다. (공백이 없는 숫자의 나열)
    • TAIL은 나머지로, 조건에 제시된 공백과 마침표, 빼기 부호와 숫자 문자가 모두 가능하다.
  • 파일명은 HEAD -> NUMBER 순으로 기준을 잡아 정렬한다. 
  • 모든 정렬 기준이 동일할 경우, 입력된 순서를 유지한다.

💻Solution

1. window를 활용한 풀이

def HeadNumberTail(file:str)->list:
    HNT_list = []
    left, right = 0, 1
    while True:
        if len(HNT_list) >= 2 or right > len(file)-1:
            HNT_list.append(file[left:])
            break
        if file[left].isdigit(): # NUMBER
            if file[right] == ' ' or (file[right].isdigit() and (right-left+1) <= 5):
                right += 1
            else:
                HNT_list.append(file[left:right])
                left = right
                right = left + 1
        else: # HEAD
            if file[right] == ' ' or not file[right].isdigit():
                right += 1
            else:
                HNT_list.append(file[left:right])
                left = right
                right = left + 1
    return HNT_list

def solution(files):
    answer = []
    file_list = []
    # file name to H.N.T
    for file in files:
        file_list.append(HeadNumberTail(file))
    # sorting
    file_list = sorted(file_list, key=lambda x: (x[0].lower(), int(x[1].replace(' ', ''))))
    return [''.join(f) for f in file_list]

 

2. 정규표현식을 활용한 풀이

import re
def HeadNumberTail(file):
    head = re.match("[\D]+", file)
    number = re.search("[\d]+", file)
    return [head[0], number[0], file[number.end():]]

def solution(files):
    answer = []
    for file in files:
        answer.append(HeadNumberTail(file))
    answer.sort(key=lambda x: (x[0].lower(), int(x[1])))
    return [''.join(file) for file in answer]

🗝️keypoint

  1. 출력한 결과는 초기 입력 결과와 같아야 하므로, 정렬 시 기존 문자열을 유지해야 한다.
  2. ["F-", "A-"]를 오름차순으로 정렬하면, ["A-", "F-"]가 된다.
  3. 숫자로 이루어진 문자열(ex - "0010")을 int()에 넣으면, 앞에 있는 0은 제거된다 (10).
  4. list는 sort(key=)를 통해 조건에 따라 정렬할 수 있다. 

'코딩테스트 > Python' 카테고리의 다른 글

[Baekjoon] 1439번 - 뒤집기  (0) 2022.09.27
[Programmers] Level 2. 모음사전  (0) 2022.09.27
[LeetCode] 409. Longest Palindrome  (0) 2022.09.26
[Programmers] Level 2. 땅따먹기  (0) 2022.09.25
[Programmers] Level 2. 방문 길이  (0) 2022.09.25

+ Recent posts