[programmers-python] 정렬

10972 단어 정렬pythonpython

K번째 수

sort 함수를 쓰면 안된다거나 그런 거일줄 알았는데 잘된다!

def solution(array, commands):
    answer = []
    for cmd in commands:
        s = sorted(array[cmd[0]-1:cmd[1]])
        answer.append(s[cmd[2]-1]) 
    return answer

가장 큰 수

첫 번째 시도

문자열로 바꿔서 비교하면 a = "21",b = "101"일 때 a>b이기 때문에 sort 대신 문자열로 비교하면 될 거라고 생각했다.

버블정렬을 이용했다.

def solution(numbers):

    # 로직의 개수
    for index in range(len(numbers)):
        swap = 0
        # 인접한 numbers 체크
        for index2 in range(len(numbers)-1-index):
            if str(numbers[index2]) < str(numbers[index2+1]):
                numbers[index2], numbers[index2+1] = numbers[index2+1], numbers[index2]
                swap +=1
        if swap == 0:
            break
    answer = "".join(map(str, numbers))
    return answer

a = "30", b = "3"일 때는 a>b임을 간과한 코드여서 2번째 케이스에서 바로 오류가 났다.

최종 정답

안풀려서 다른 사람 코드를 봤다.

def solution(numbers):
    numbers = sorted(list(map(str, numbers)), key=lambda x: x*3, reverse=True)
    return str(int(''.join(numbers)))

문자열은 숫자형과 달리 첫 글자가 큰 순서대로, 문자열의 길이가 긴 순서대로 크기 비교가 가능한 것을 이용한 코드다.

a="30",b="3" 일 때는 a>b로 나오지만 a="303030", b="333"일 때는 a<b로 결과를 내기때문에 원소를 문자열로 바꾼 후 3씩 곱해준 것.

H-Index

첫 번째 시도

test case에서 에러났다.

def solution(citations):
    answer = 0
    citations = sorted(citations, reverse=True)
    for h in range(len(citations), 0, -1):
        checkH = 0
        for index in citations:
            if index >= h:
                checkH += 1
            else:
                break
        if checkH == h:
            answer = h
            break
    return answer

최종 정답

못풀어서 다른 코드를 참고했다.
아래 코드가 좋아요를 가장 많이 받은 풀이 방법이다.

def solution(citations):
    citations = sorted(citations)
    l = len(citations)
    for i in range(l):
        if citations[i] >= l-i:
            return l-i
    return 0

Reference

좋은 웹페이지 즐겨찾기