본문 바로가기

pccp 대비 교육 문제 풀이 - 프로그래머스

파트6. 정렬과 탐색 - [Sorting] 실습문제4 (가장 큰 수 42746번) python

 

많은 수정 과정을 거친 문제이다...

우선 가장 처음 짠 코드!

def solution(numbers):
    answer = sorted(list(map(str,numbers)), reverse=True)
    return ''.join(answer)
  • 정수를 map 함수 통해 string으로 바꿔주고, 정렬한다.
  • 이때, 내림차순 정렬을 위해 reversed 옵션을 True로 설정한다.
  • 리스트로 되어있는 answer을 공백 없이 join해주며 리턴한다.

 처음에 map함수에 list를 안 붙였더니 출력값이 이상했다. map object at 0x00605c0과 같은...

검색해보니 map 함수의 수행결과는 map object이기 때문에 반복문이나 리스트 변환 등을 통해 실제 값을 접근하거나 출력해야 한다.

아무튼 채점해보니

낮은 점수가 나왔다. 

이러한 케이스 때문이라는 것은 알았지만, 해결 방법을 찾지 못해 구글링해보았다.

 

30, 34, 3 이라는 숫자가 있을 때 그냥 정렬을하면 34 30 3이 나오게 된다.

그러나 34 3 30 순으로 정렬될 필요가 있다.

해결책은 저 숫자들을 모두 3자리 수로 만들어 비교하는 것이다.

343434, 333, 303030 이렇게 하면 원하는대로 정렬이 된다. (34, 3, 30 순으로)

문자열로 변경해두었으니, x*3을 하면된다.

이후, 수정된 코드이다.

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

그래도 틀린 케이스가 하나 있다.

구글링 again...

배열 모두 0의 값을 가질 때 출력은 그냥 0이 되어야하는데, 000이런 식으로 나온다는 것이다.

 

아래는 해결 코드이다...

def solution(numbers):
    answer = ''
    sum = 0
    answer = sorted(list(map(str, numbers)), key=lambda x:x*3, reverse=True)
    for i in numbers:
        sum += i
    if sum == 0:
        return '0'
    return ''.join(answer)
  • 똑같이 정렬을 해준다.
  • 이후 반복문을 통해 sum에 모든 원소들을 더한다.(이때 numbers를 사용한다. answer는 문자열로 변환되어 있기 때문)
  • sum이 0이면 모든 원소가 0이라는 뜻이기 때문에 0을 리턴한다.
  • 사실 이때 또 한 번 틀렸었는데, return 0이 아니라 return '0'으로 해야한다...
  • 작성하고보니 sum을 선언하지 않고 그냥 i에 계속 더해줘도 정답이다 ㅎ

벽 느껴지는 문제였다...