[프로그래머스] [3차] 파일명 정렬

yunu·2022년 3월 2일
0
post-thumbnail

출처: 프로그래머스 코딩 테스트 연습, [프로그래머스] [3차] 파일명 정렬

새로 알게된 것들

1. 알파벳으로 이루어진 문자열을 모두 대문자 또는 소문자로 바꾸는 메서드. 분명히 파이썬에서라면 기본 메서드가 있을 것이라고 확신하며 검색을 하였다. '문자열'.lower()이나 '문자열'.upper()을 사용하면 된다. 이외에도 '문자열'.islower(), '문자열'.isupper()등도 알아두면 좋을 것 같다.

'문자열'.lower()
'문자열'.upper()
'문자열'.islower()
'문자열'.isupper()

2. 문제를 풀다보면 정렬을 사용해야 되는데 기본 메서드인 sorted, sort를 사용하면 내가 원하는 대로 정렬하지 못하기 때문에 커스텀하기 위해 정렬을 직접 만들어야 했다. 가장 먼저 떠오르는 선택 정렬 사용하여 풀었을 때는 정렬하는 방법에 따라 정답에 도출하지 못하기 때문에 기본 순서를 유지하며 정렬하기 위해 다시 버블 정렬을 검색하여 풀었다.
정확하게 버블 정렬을 사용하면 크기가 같은 원소일지라도 서로 순서가 뒤바뀌는 문제가 없어서 사용하였다.

# 선택 정렬
for i in range(n - 1):
        min = i
        for j in range(i + 1, n):
            if split_files[j][0].lower() < split_files[min][0].lower():
                min = j
            elif split_files[j][0].lower() == split_files[min][0].lower():
                if int(split_files[j][1]) < int(split_files[min][1]):
                    min = j
        split_files[i], split_files[min] = split_files[min], split_files[i]

# 버블 정렬
    for i in range(n - 1):
        for j in range(n - 1 - i):
            if split_files[j + 1][0].lower() < split_files[j][0].lower():
                split_files[j + 1], split_files[j] = split_files[j], split_files[j + 1]
            elif split_files[j + 1][0].lower() == split_files[j][0].lower():
                if int(split_files[j + 1][1]) < int(split_files[j][1]):
                    split_files[j + 1], split_files[j] = split_files[j], split_files[j + 1]

풀이

1. 주어진 파일들을 head, number, tail로 나누어 저장한다. (주어진 테스트케이스가 경우가 적은 것이였다면 문제를 바로 틀렸을 것이다.)

2. 버블정렬을 통해 문제를 정렬한다.

코드

def solution(files):
    split_files = []
    for file in files:
        head, num = 0, len(file)
        flag = 'head'
        for i in range(len(file)):
            if flag == 'num':
                if file[i] < '0' or file[i] > '9':
                    num = i
                    break
                continue
            if file[i] >= '0' and file[i] <= '9':
                head = i
                flag = 'num'
        split_files.append([file[:head], file[head:num], file[num:]])

    n = len(files)
    # 버블정렬
    for i in range(n - 1):
        for j in range(n - 1 - i):
            if split_files[j + 1][0].lower() < split_files[j][0].lower():
                split_files[j + 1], split_files[j] = split_files[j], split_files[j + 1]
            elif split_files[j + 1][0].lower() == split_files[j][0].lower():
                if int(split_files[j + 1][1]) < int(split_files[j][1]):
                    split_files[j + 1], split_files[j] = split_files[j], split_files[j + 1]

    answer = list(map(lambda x: ''.join(x), split_files))
    return answer

다른 사람 풀이를 보며 알게 된 점

다른 사람의 풀이를 보면서 내가 너무 어렵게 풀었구나하고 파이썬의 문법을 아직 나는 잘 모른다는 생각을 했다. 파이썬의 sorted메서드는 크기가 같은 원소는 순서가 그대로 된다는 것도 알게 되었다. 문법을 더 잘 이용하면 코드 수가 더 줄고 더 간결해지고 무엇보다 더 빠르게 문제를 풀 수 있어 단순히 알고리즘 문제를 풀기보다 파이썬 문법이나 메서드가 어떻게 작동하는지 더 공부를 해야겠다. 그래도 선택 정렬과 버블 정렬이 무엇이고 어떻게 구현하는지는 얻어간거 같다.

profile
rip

0개의 댓글