[프로그래머스] 알고리즘 - 정렬 가장 큰 수

Sohyeon·2020년 12월 1일
0

알고리즘

목록 보기
7/10

문제 설명

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

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

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

제한 사항

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

아이디어

  1. (망)
    문제 자체만 보면 되게 단순해 보이는데 하나하나 따져봤을 때, 생각보다 고려해야할 게 많았다.
    그래서 우선 가장 눈에 띄는 조건들부터 정리하기 시작.
  • 각 number의 첫 자리 (숫자 맨 앞자리 수)만 구해 비교한다.
    str() -> slicing [:1] -> map(int, number) -> [3,3,3,5,9] 마지막이 이럴 것이라 생각.

  • 문제
    문제에서는 예시로 30,3,34가 있을 때 34->3->30 이런 순으로 순서를 매겼는데 이러면 둘째 자리를 또 비교해야한다.

    둘째 자리만이 문제가 아니라 제한 사항에 따르면 원소는 1000이하이므로 최대 4번의 반복된 연산이 시행될 것으로 보였다. 이러면 연산반복도 문제, 비교하는 것도 문제, answer에 넣는 것도 모두 문제였다.. 여기까지 생각이 도달하니 이건 아니다 싶었음.
    총 5분 정도 고민한 것 같다...

  1. 문자열은 아스키코드로 비교가 가능하다!

    이 생각이 들고 유레카! 싶어서 이것저것 시도하다 보니 정말 딱 아이디어 하나만 더 있으면 완벽하겠다 싶었는데 도저히 생각이 안났다.
    마침 문자열 비교를 검색해 보고 있는데, 똑똑하신 블로거님의 글을 보았고.. 이 문제의 키포인트는 사실 x*3을 이용해 문자열을 3번 반복해 비교하는 것이라는 엄청난 힌트를 보아버렸고.. 어쩌다보니 그 분과 코드가 너무 비슷해졌지만 덕분에 충분한 공부를 했다. (블로그 링크는 출처란)

코드

  • if 문은 왜 있나?
    제출 후 채점하기를 누르니 다 통과가 뜨는데 테스트 11번만 계속 실패가 떴다. 도대체 무슨 테스트 케이스 이길래 안되나 싶어 여러 테스트를 생각해보다 혹시..? 했는데 질문하기엗 ㅡㄹ어가보니 [0, 0, 0]같이 모두 0인 경우 answer는 0이 되어야하는 케이스였다. 그래서 if문을 추가해 줌.

출력

출처
프로그래머스 https://programmers.co.kr/learn/courses/30/lessons/42746
코드 참고 https://wooaoe.tistory.com/82

profile
춤 추는 주니어 프론트엔드 개발자입니다

0개의 댓글

관련 채용 정보