프로그래머스 가장 큰 수

차민재·2022년 2월 26일
0
post-thumbnail

문제

요약: [3, 30, 34, 5, 9]의 배열에서 순서를 바꿔 이어붙여서 만들 수 있는 가장 큰 수인 "9534330"를 문자열 형태로 리턴.

풀이

def solution(numbers):
    answer = ''
    #1.문자열화 시키기
    #방법 1-1
    # s = []
    # for i in numbers:
    #     s.append(str(i))
    # print(s)
    #방법 1-2
    numbers  = list(map(str,numbers))
    numbers.sort(key = lambda x: x*3,reverse = True)
    # print(numbers)
    answer = str(int(''.join(numbers)))
    return answer

과정

이 문제를 보고 일단 앞 숫자를 보고 정렬을 시작해야 한다는 것을 알았고,
버블 정렬을 사용해서 앞 숫자만 일단 비교하였다.

그러기 위해서 모두 문자열화 시키고 비교할 경우 맨 앞 숫자를 비교하기 때문에 문자열로 만드는 생각을 했다.

하지만 이 문제가 그렇게 간단하지만 않은 게 제일 앞 숫자가 큰 숫자를 배열의 앞에 놓아도 34,3,30 같이 앞 숫자가 같고 뒤가 다른 경우를 처리하기가 너무 까다로웠다.
그래서 한 수 접고 다른 사람들의 코드를 보고 아이디어를 배웠다.

34 30 3은 이미 문자열화 된 숫자이기 때문에 문자열X3을 할 경우
343434, 303030, 333이 되는데, 여기서 정렬을 쓰자면, numbers는 1000이하의 수 즉 앞 세자리만 비교하게 된다. 그 때 reverse = True 내림차순으로 정렬을 한다.
나는 처음엔 이해가 잘 안됬는데 52,5,56 같은 것을 만들어서 이해했다. 이 경우는 한 자리 숫자인 5가 이어지는 52의 2보다 크기때문에 앞에 와야한다.
ex)52,5,51 -> 525252,555,515151 -> 5 52 51
ex)554 5 56 -> 554554554,555,565656 ->56,5,521
이해가 된다. 5는 뒤의 숫자와 이어지면 55가 되기 때문에 56 보다 작다. 또한 55는 554의 55와 같은데, 여기서 문자열 x3을 했기 때문에 이마저도 비교할 수 있다.

sort(key = lambda(x:x*3,reverse = True)) 

느낀 점

버블 정렬을 배웠다. 3,34,30을 처리하기에는 부족했지만 정렬 공부도 했다.

map을 이용하면 바로 문자열화 시킬 수 있다.

프로그래머스는 문자열, 배열 관련된 문제가 많은 것 같다. 아직 레벨 낮은 것만 건드려서 그런 것 같다. 백준도 열심히 해보자.

profile
안녕하세요

0개의 댓글