본문 바로가기
알고리즘

가장 큰 수

by 배우고 성장하는 청년 블로그 2021. 8. 2.

출처: 프로그래머스

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

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

[문제 설명]

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 만드는 문제

 

[예시]

예시

[제한 사항]

 - numbers의 원소는 0이상이고 1,000이하의 숫자

 - numbers의 길이는 1이상이고 100,000이하의 리스트

 - return 값은 문자열로 출력

 

[알고리즘]

 1) numbers의 각 숫자들을 문자로 변경

 2) 각 숫자들의 길이를 4개가 되도록 변경

    - numbers의 원소가 0 이상이고 1000이하의 숫자이기 때문에

    - 2번째 예시에서 볼 수 있듯이, 3보다 30이 뒤에 있고 3보다 34가 앞에 있다.

    - 따라서, 아래의 규칙이 만족되도록 변경

    - (1) 길이가 1인 경우: 길이가 4개가 되도록 이어 붙인다.

        ex) 3인 경우 => 3333

    - (2) 길이가 2인 경우: 문자로 변경된 숫자를 이어 붙여서 4개가 되도록 한다.

        ex) 32인 경우 => 3232

    - (3) 길이가 3인 경우: 문자로 변경된 숫자에 문자로 변경된 숫자의 첫번째 문자를 이어 붙여서 4개가 되도록 한다. 

        ex) 321인 경우 => 3213   

    - (4) 길이가 4인 경우: 문자로 변경된 숫자를 그대로 사용

        ex) 1000인 경우 => 1000

 

 3) 각 길이가 4개로 변경된 문자와 원래 문자 길이를 리스트에 저장

 4) 리스트를 문자를 기준으로 내림차순으로 정렬

 5) 정렬된 순서대로 문자를 원래 문자 길이만큼만 슬라이스하여 정답에 이어붙인다.

 6) 예외처리 -> n개의 0이 나오면 0....0으로 나오게 되는데, 이 부분을 0으로 변경해준다.

 

[전체 코드]

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
def solution(numbers):
    answer = ''
    items = []
    for number in numbers:
        # 1자리
        if 0 <= number <= 9:
            items.append([str(number) * 41])
        # 2자리
        elif 10 <= number <= 99:
            items.append([str(number) + str(number), 2])
        # 3자리
        elif 100 <= number <= 999:
            items.append([str(number) + str(number)[0], 3])
        # 4자리 => 1000
        elif number == 1000:
            items.append([str(number), 4])
    
    # 정렬
    items = sorted(items, key=lambda x:x[0], reverse=True)
    
    # 정답 삽입
    for item, size in items:
        answer += item[:size]
    
    # 예외 처리
    if int(answer) == 0:
        answer = '0'
    
    return answer
cs

 

[느낀점]

처음에는 모든 경우의 수를 따지기 위해, 조합을 사용해서 결과를 도출하였다.

하지만, 너무 오래 걸리기 때문에 다른 방법을 찾다가 30이 3보다 작은 걸 알게 되고 전체 길이를 맞춰서 정렬을 하고 정답을 도출하니 정답을 맞추게 되었다.

항상 모든 경우를 따지는 거는 하지 않는 것이 좋을 것 같다.

'알고리즘' 카테고리의 다른 글

오픈채팅방 [2019 KAKAO BLIND RECRUITMENT]  (0) 2021.07.27
약수의 개수와 덧셈  (0) 2021.07.16