티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/17686
입력: ["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"]
출력: ["img1.png", "IMG01.GIF", "img02.png", "img2.JPG", "img10.png", "img12.png"]
HEAD(문자열), NUMBER(숫자), TAIL(없을수도 있음) 로 이루어진 문자열을 정렬 해서 반환해주는 함수를 만들어주면 된다.
- 리스트를 순회 하며 하나의 문자열을 HEAD, NUMBER 로 나눈다.
- HEAD를 기준으로 정렬, HEAD가 같으면 NUMER로 정렬 한다.
- 반환
1번 나누는 부분이 핵심인 문제이다.
이 코드에서는 name = re.split('(\d+)', name)
과 같이 나눴다. re.split 은 문자열에서 패턴이 맞으면 이를 기점으로 리스트로 쪼개는 함수이다. "img12.png" 를 위와 같이 나눌경우 ["img", "12", ".png"] 와 같이 리스트로 분리되어 나온다. 문제에서
HEAD는 숫자가 아닌 문자로 이루어져 있으며, 최소한 한 글자 이상이다.
NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 이루어져 있으며
라는 조건이 있기 때문에 숫자로 나누면 HEAD 와 NUMER를 확실히 나눌 수 있다. 이렇게 나눈 후 세부 조건을 보면
파일명은 우선 HEAD 부분을 기준으로 사전 순으로 정렬한다. 이때, 문자열 비교 시 대소문자 구분을 하지 않는다. MUZI와 muzi, MuZi는 정렬 시에 같은 순서로 취급된다.
-> HEAD.upper()를 사용하여 모두 대문자로 만든 후 비교해 준다. lower() 또한 가능하다.
파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다. 9 < 10 < 0011 < 012 < 13 < 014 순으로 정렬된다. 숫자 앞의 0은 무시되며, 012와 12는 정렬 시에 같은 같은 값으로 처리된다.
-> NUMER를 int() 함수를 사용하여 int형태로 바꾸어 비교한다. 0123 -> 123으로 자동으로 변환 된다.
두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다. MUZI01.zip과 muzi1.png가 입력으로 들어오면, 정렬 후에도 입력 시 주어진 두 파일의 순서가 바뀌어서는 안 된다.
-> <= 연산자가 아닌 < 연산자를 써주어 같을 경우에는 바꾸지 않도록 한다.
import re
from functools import cmp_to_key
def compare(i1,i2):
name1 = re.split('(\d+)', i1)
name2 = re.split('(\d+)', i2)
name1[0] = name1[0].upper()
name2[0] = name2[0].upper()
name1[1] = int(name1[1])
name2[1] = int(name2[1])
if name1[0] < name2[0]:
return -1
elif name1[0] == name2[0]:
if name1[1] < name2[1]:
return -1
else:
return 1
else:
return 1
def solution(files):
result = sorted(files,key=cmp_to_key(compare))
return result
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 문자열 뒤집기
- ManyToMany
- 팰린드롬수
- go context
- query
- 의대 신경학 강의
- sql lite
- django
- gunicorn
- 소프트웨어 장인
- conTeXt
- 방금그곡
- 백준
- for-else
- 독후감
- 프로그래머스
- dfs
- 파이썬
- Python
- Two Scoops of Django
- stdout
- taggit
- go
- leetcode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함