일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Python
- 파이썬
- 프로그래머스
- 알고리즘
- C
- 카카오
- 운영체제
- 코딩테스트
- IT
- 엘라스틱서치
- Linux
- 자바
- 리눅스
- 캐시
- 백엔드
- Elasticsearch
- Java
- programmers
- Spring
- 네트워크
- docker
- 스프링부트
- 스프링
- springboot
- Kakao
- 도커
- 개발자
- 프로그래머스 #카카오 #IT #코딩테스트
- 쿠버네티스
- DPDK
- Today
- Total
저고데
[프로그래머스][3차]파일명 정렬 본문
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17686
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드를 작성하기 위한 순서는 다음과 같다.
1. 파일을 정렬할 때, head와 number로만 정렬을 하므로 두 가지의 리스트만 만들어준다.
2. 숫자가 아닌 경우, head에 넣어주고 숫자라면 number에 넣어준다.
3. number를 다 넣은 상태에서 문자나 숫자를 만났다면 이는 tail에 해당하는 것이므로 종료시킨다.
4. 정렬을 한다면 순서가 뒤틀리기 때문에 이를 기록하기 위해서 index 값도 같이 넣어준다.
5. 람다함수를 사용하여 head를 기준으로 먼저 정렬한 후, number를 기준으로 정렬한다.
6. 정렬한 리스트를 통하여 index 값에 따라 순서대로 파일명을 answer에 넣어준다.
def solution(files):
answer = []
hnt=[] #1번 : head와 number로 나뉜 모든 파일명
for i in range(len(files)):
index=0
temp=[] #1번 : head와 number로 나뉜 하나의 파일명
head=[] #1번
number=[] #1번
for j in files[i]:
if not number and not j.isdigit(): #2번
head.append(j.lower())
elif number and not j.isdigit(): #3번
break
elif j.isdigit(): #2번
number.append(j)
temp.append(''.join(head))
temp.append(''.join(number))
temp.append(i) #4번
hnt.append(temp)
hnt.sort(key=lambda x : (x[0],int(x[1]))) #5번
for i in hnt:
answer.append(files[i[2]]) #6번
return answer
문제의 조건대로 head와 number를 잘 분리하여 람다함수를 사용하여 정렬하였다.
처음에는 숫자이지만 어떻게 number인지 tail인지 구분하는 방법을 헷갈려해서 필요없는 작업을 많이 진행하였다.
아래의 코드가 그에 해당하는 것인데, 정확성은 있으나 효율성이 떨어져서 반 이상이 런타임 에러가 발생하였다.
해당 문제의 경우, 시간복잡도를 줄일 자료구조나 알고리즘을 떠올릴 수가 없었다.
그럴 때는 필요없는 부분이 무엇인지 혹은, 문제에 조건에 맞게 더 깔끔하게 코드를 작성할 수 있는지 확인하는 것이 좋은 방법일 듯하다.
def solution(files):
answer = []
hnt=[]
for i in range(len(files)):
temp=[]
head=[]
number=[]
first=True
for j in range(len(files[i])-1):
if first and not files[i][j].isdigit():
head.append(files[i][j].lower())
elif first and files[i][j].isdigit():
number.append(files[i][j])
if not files[i][j+1].isdigit():
first=False
if not first:
break
if first:
number.append(files[i][len(files)-1])
head=''.join(head)
number=''.join(number)
temp.append(head)
temp.append(number)
temp.append(i)
hnt.append(temp)
hnt.sort(key=lambda x : (x[0],int(x[1])))
for i in hnt:
answer.append(files[i[2]])
return answer
'프로그래머스' 카테고리의 다른 글
[프로그래머스]2개 이하로 다른 비트 (0) | 2023.02.07 |
---|---|
[프로그래머스]2 X n 타일링 (0) | 2023.02.07 |
[프로그래머스] 완주하지 못한 선수 (0) | 2023.02.06 |
[프로그래머스]모음사전 (0) | 2023.02.06 |
[프로그래머스][1차]프렌즈 블록 (0) | 2023.02.06 |