[프로그래머스_Lv2] 가장 큰 수 - python 문자열의 비교

Lee, Chankyu·2022년 2월 7일
0
post-thumbnail

네트워크

문제 링크


나의 풀이

# 1차 풀이(오답)

def solution(numbers):
    answer = ''
    str_num = []
    for number in numbers:
        str_num.append(str(number))

    str_num.sort(key=lambda x : x[0] if x <=9 else (x[1] if 10 <= x <100 else x[2]) reverse=True)
    answer = str(int("".join(str_num))) 
    # 000 과 같은 결과가 나올경우 '0' 으로 만들어 줘야하므로 int변환후 다시 str로 변환하였다. 

    return answer
  • 문제를 어떻게 풀어야할지 방법은 금방 떠올랐지만 주어진 숫자 배열(numbers)을 원하는 조건대로 정렬하는 것이 쉽지 않았다. 숫자별로 가장 앞자리 수를 비교하고 가장 앞자리수가 같으면 두번째 자리수를 비교하는 식으로 하여 정렬해야 했다.

  • sort()함수의 key 값 설정시 if문으로 어떻게든 해보려했으나 실패하였다.


2차 풀이

def solution(numbers):
    answer = ''
	
    str_num = list(map(str, numbers))
    str_num.sort(key=lambda x : x * 3, reverse=True)
    answer = str(int("".join(str_num)))

    return answer
  • lambda x : x*3은 num 인자 각각의 문자열을 3번 반복한다는 뜻이다.
    -> num의 인수값이 1000 이하이므로 3자리수로 맞춰서 비교하는 것이 의도이며 이 문제의 핵심이다.

  • 이렇게 하는 이유에 대해서 설명해보자면, 문자열 비교는 ASCII 값으로 치환되어 정렬된다. 따라서 666, 101010, 222의 첫번째 인덱스 값으로 비교한다.
    ASCII 코드 상, 6 = 86, 1 = 81, 2 = 82 이므로 6 > 2 > 1순으로 크다.

  • 만약 numbers가 [221,2,10] 이렇게 주어졌다고 가정해보면 x*2를 하면 [221221,22,1010]가 되고, 이렇게 되면 22보다 221이 문자열 비교해도 더 큰수로 나오기 때문에 원하는 정렬이 되지 않는다. 따라서 1000이하의 조건이기때문에 x*3을 해줘야한다.

  • sort()의 기본 정렬 기준은 오름차순이므로,reverse = True 설정


profile
Backend Developer - "Growth itself contains the germ of happiness"

0개의 댓글