[Algorithm] 정렬 문제 - 프로그래머스 - 가장 큰 수, 실패율

Jifrozen·2021년 7월 22일
1

Algorithm

목록 보기
28/70

실패율

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

def solution(n, stages):
    answer = []
    # 계수정렬 생각하고 품
    count = [0] * (n + 1)
    for i in range(len(stages)):
        count[stages[i] - 1] += 1
    for j in range(n):
        if count[j] == 0:
            answer.append([0, j + 1])
        else:
            answer.append([count[j] / sum(count[j:len(count)]), j + 1])
    result = [0] * n
    answer = sorted(answer, key=lambda answer: -answer[0])
    for k in range(n):
        result[k] = answer[k][1]
    return result


print(solution(5, [2, 1, 2, 6, 2, 4, 3, 3]))

일정 범위가 존재하기 때문에
계수정렬을 사용했다.

1715 카드 정렬하기

쉽다고 생각했는데 안풀린다...

가장 큰 수

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

def solution(numbers):
    for i in range(len(numbers)):
        numbers[i] = str(numbers[i])
    answer = []
    numbers = sorted(numbers, key=lambda x: (x * 4)[:4], reverse=True)
    if numbers[0] != '0':
        answer = "".join(numbers)
    else:
        return '0'

    return answer


print(solution([1,10,2,20]))

처음에 permutations 이용했더니 시간초과가 나왔다.
str을 내림차순으로 정렬하면
20,2,10,1이다.
하지만 최대값은 2 20 1 10 이기 때문에
정렬의 조건을 하나 더 해줘야한다.

고민해보면 20 21 일때는 2 20 이렇게 2가 먼저 나와야하지만
22일때부터는 2가 먼저일 필요가 없다.
따라서 익명함수에 (x * 4)[:4]
집어넣어
x = 2 2222 -> 2222
x = 20 20202020 -> 2020
x = 10 10101010 -> 1010
x = 1 1111 -> 1111
으로 4자리만 비교해서 내림차순 정렬을 하면
2,20,1,10이 나온다.

생가보다 오래걸린 부분은

if numbers[0] != '0':
        answer = "".join(numbers)
    else:
        return '0'

    return answer

이 부분이였다.
테스트 케이스가 [0,0,0]이면
0이 나와야한다.
근데 그냥 0을 반환하면 안되고 문자열 '0'을 반환해야한다.

1개의 댓글

comment-user-thumbnail
2021년 7월 22일

안녕하세요, 김덕우입니다. 카드 정렬 문제를 혼자의 힘으로 푸신 게 정말 대단하다고 생각합니다! 저도 처음에 permutations로 풀었는데 도무지 다른 아이디어가 떠오르지 않더라고요... 수고하셨습니다@!!!

답글 달기