CodingTest/정렬 알고리즘

프로그래머스 (Level 2) - 가장 큰 수

seongduck 2022. 8. 6. 19:23

1. 문제 설명

  • 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내라.
  • 예를들어 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고 가장 큰 수는 6210이다.
  • 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 가장 큰 수를 문자열로 바꾸어 return하라.

2. 제한사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으므로 문자열로 바꾸어 return 합니다.

3. 입출력 예

array return
[6, 10, 2] "6210"
[3,30,34,5,9] "9534330"

4. 풀이 접근

  1. array의 numbers를 모두 문자열로 바꿔준다.
  2. numbers의 원소는 0 이상 1,000이하이므로 각 문자열에 3번씩 곱해준다.
    1. 3, 30, 34의 경우 3333-3030-3434 = 34,3,30 이렇게 크기를 비교할 수 있으므로
  3. 그상태에서 내림차순으로 정렬한다.
  4. int형으로 한 번 바꿔주고 str형으로 다시 바꿔준다.
    1. 0000 같은 수가 있을 수 있으므로 -> 0으로 바꿔주는 작업

5. 코드

def solution(array):
    array = list(map(str, array)) # 1
    array.sort(key = lambda x : x* 3, reverse = True) # 2: 각 요소 3을 곱해준다면~ , 3
    array = str(int("".join(array))) # 4
    return array
  • map() 함수는 리스트를 인자로 받고, 이 리스트의 아이템들을 다른 값으로 변경할 때 사용한다.
  • list형태이므로 list() 함수를 사용한다.
  • key (즉, array의 문자열 값들) 을 세 번씩 곱해줬을 때 큰 순서대로 내림차순으로 정렬해준다.
  • 0000같은 경우를 방지하기 위해 int 형으로 바꿔준 후 다시 str형으로 바꾼다.
def solution(array):
    array = sorted(list(map(str, array)), key = lambda x : x * 3, reverse = True)
    return str(int("".join(array)))
  • 굳이 간결하게 한줄로 쓴다면 이렇게..

6. 알아둘만한 문법

array = ["안녕","애들아"]
"".join(array)

",".join(array)
#출력 결과
안녕 애들아

안녕,애들아
  • 파이썬 리스트 문자열 합치기 -> ""에 아무것도 안 썻으므로 띄어쓰기로 출력
  • 반대로 ""안에 ,를 사용했으므로 ,기준으로 출력

 

array = list(map(str, array))
  • 리스트 형 변환, 리스트안 요소들의 정수형을 문자열로 변경 

 

<lambda 함수>

list(filter(lambda x : x < 7, array))
  • list 형 array에서 각 요소가 7보다 작은 경우만 출력

 

array.sort(key = lambda x : x * 3, reverse = True)
  • array 배열의 각 요소(key 값)를 3씩 곱해보고 큰 순서대로 내림차순 정렬 (실제 곱해지는 건 아님)