본문 바로가기

프로그래머스 고득점kit/정렬

프로그래머스 코딩테스트 연습 - [정렬] - 가장 큰 수

728x90

(문제) 

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항
  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예numbersreturn
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"


( 문제 설띵 )

두 번째 예시로 설명을 하자면 [3, 30, 34, 5, 9]을 조합하여 가장 큰 수를 만들려고 생각을 해봅시다.

...

...

그렇습니다. 나열된 숫자 중에서 앞에 자릿수가 큰 순서대로 정렬하면 되는 정렬 문제입니다.

9 > 5 > 3..... 이런 식으로

그럼 그렇게 정렬을 하면 쟌넨! "9533430" 이 나올 수 있습니다. 네 오답이죠

왜 그럴까요

3, 30, 34 일 때는 앞자리 수가 같으니 그다음 자릿수가 큰 수로 나와야 됩니다.

34 > 3 > 30 이렇게 되겠죠.

  • numbers의 원소는 0 이상 1,000 이하입니다.

이니까 4개의 자릿수 인덱스를 큰 수대로 정렬하면 되겠다 싶을 겁니다.

strNumbers2 = sorted(strNumbers2, key=lambda x: (-int(x[1][0]), (-int(x[1][1])), (-int(x[1][2]))))

이런 식으로 정렬하면 되겠네.. 하지만 땡!

오류가 날 겁니다 왜냐?

원소의 개수가 1개 -> 0~ 9

2개 -> 11~99.. 등 무작위 수인데

0~3개의 인덱스를 비교한다고 코딩하면 없는 자릿수 인덱스를 정렬한다고 하니 오류가 나겠죠.

해결방법으로는 제가 생각하기에...

if문을 써서 각각 자릿수에 따라 정렬해도 되고요

아래와 같이도 해볼 수 있을 거 같네요.

sortarr = sorted(strNumbers, key=lambda x: ((-int(x[0])), (-int(x[1 % len(x)])), (-int(x[2 % len(x)])), (-int(x[3 % len(x)]))))

나머지 연산자를 이용하는 방법이죠.. ㅎ

2개의 숫자 21이 왔다 치면

x[0] 은 그대로 2를 체크

x[1% len(x)] => 1 % 2 => 나머지가 1이 되므로 결론적으로 x[1]을 체크

x[2 % len(x)] => 2 % 2 => 0을 체크하게 만듦으로써 아까 오류가 났던 부분을 보완하는 방법이죠.

이외에 제가 언급하지 않은 방식으로 푸는 분들이 많았습니다. 궁금하시다면 구글링을 통해 찾아보시길..

 


[ 코드 ]

 

# 2. 가장 큰 수

def solution(numbers):
    answer = ''
    strNumbers = []
    for n in numbers:
        strn = str(n)
        strNumbers.append(strn)

    sortarr = sorted(strNumbers, key=lambda x: ((-int(x[0])), (-int(x[1 % len(x)])), (-int(x[2 % len(x)])), (-int(x[3 % len(x)]))))
    # print(sortarr)

    for s in sortarr:
        answer += s
    return answer


numbers = [6, 10, 2]
numbers1 = [3, 30, 34, 5, 9]
sol = solution(numbers1)
print(sol)

후기

 

효과적인 인덱스의 이용에 대해 사고를 넓히게 될 수 있는

좋은 문제라고 생각되네요.

 

728x90