부트캠프

[22일차] TIL - Week3 Test

반응형

1. H-Index

https://programmers.co.kr/learn/courses/30/lessons/42747

처음에 대부분의 테스트를 통과하지 못했었는데 문제를 잘못 이해하고 있었습니다. h의 값이 반드시 citations배열에 존재 하지 않아도 된다는 것을 간과했습니다. 다음은 정답 판정 받은 풀이입니다.

def solution(citations):
    answer = 0
    citations.sort(reverse=True)    
    lst = [i for i in range(max(citations))]
    lst.sort(reverse=True)
    
    for h in lst:
        lg = 0
        sm = 0
        for num in citations:
            if h <= num:
                lg += 1
        if lg >= h:
            answer = h
            break
        
    return answer

하지만 코드를 줄일 수 없을까 고민하다가 다음과 같은 풀이를 찾았습니다.

 

def solution(citations):
    citations.sort()
    length = len(citations)

    for i in range(length):
        if citations[i] >= length - i:
            return length - i
        
    return 0

 

 

 

2. [3차] 파일명 정렬

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

처음 정규식으로 풀 수 있을 것같았지만 정규표현식이 아직 익숙하지 않아서 for문으로 타입을 체크하는 방식으로 시도했습니다.

def solution(files):
    answer = []
    
    lst = []
    for idx, file in enumerate(files):
        s = n = rest = ''
        s_flag = True
        for each in file:
            if not each.isdigit():
                temp_s = each.lower()
                if s_flag:
                    s += temp_s
                    
            if each.isdigit():
                s_flag = False
                n += each
                
        lst.append((s, n, idx))
    
    lst.sort(key=lambda x: (x[0], int(x[1]), x[2]))
    
    for i in lst:
        answer.append(files[i[2]])
        
    
    return answer

위와 같이 풀었지만 테스트케이스에서 7개 정도가 통과를 하지 못했습니다. 그리고 정규식으로 푸는 방법을 찾아보았습니다.

어떤 테스트케이스에서 통과를 못하는지 찾지 못해서 다른 팀원분에게 질문드렸고 답을 찾을 수 있었습니다.

tail에서 숫자가 중복으로 붙을 수 있다는 점이 문제였습니다. 다음은 수정한 코드입니다.

 

def solution(files):
    answer = []
    
    lst = []
    for idx, file in enumerate(files):
        s = n = rest = ''
        s_flag = True
        for i, each in enumerate(file):
            if each.isdigit():
                n += each
                s_flag = False
            elif s_flag:
                s += each.lower()
            else:
                rest = file[i:]
                break
            
        lst.append((s, n, idx))
    
    print(lst)
    lst.sort(key=lambda x: (x[0], int(x[1]), x[2]))
    
    for i in lst:
        answer.append(files[i[2]])
        
    return answer

 

정규식으로 풀면 코드길이가 매우 줄어들기 때문에 다음에 같은 유형의 문제를 마주쳤을 때 효율적으로 풀기 위해서 정규표현식에 대해 공부를 해야겠습니다.

 

다음은 re를 이용한 풀이과정과 코드입니다.

 

import re
def solution(files):
    temp = [re.split(r"([0-9]+)", s) for s in files]
    sort = sorted(temp, key=lambda x: (x[0].lower(), int(x[1])))
    return [''.join(s) for s in sort]

re는 정규식 관련 라이브러리입니다.

1. 우선 숫자를 기준으로 split 합니다.

2. 조건에 맞춰서 정렬합니다.

3. 정렬된 리스트 안에 있는 split된 것을 문자열로 합쳐서 출력한다.

 

반응형