수미니그
개발자 X
수미니그
전체 방문자
오늘
어제
  • 전체 (17)
    • Algorithms (13)
      • Concepts (0)
      • 백준 (BOJ) (4)
      • 프로그래머스 (Programmers) (9)
    • SQL (4)
    • 일상 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 해시
  • BOJ
  • n진수
  • select
  • 스택
  • Algorithm
  • 알고리즘 풀이
  • Dictionary
  • 백준
  • MAX
  • 프로그래머스
  • sum
  • Lambda
  • 집계 함수
  • 정렬
  • BFS
  • 알고리즘
  • programmers
  • MIN
  • count
  • Python
  • 소수
  • DP
  • SQL
  • 구현
  • 자료구조
  • DFS
  • group by

최근 댓글

최근 글

@ 수미니그
hELLO · Designed By 정상우.
수미니그

개발자 X

Algorithms/프로그래머스 (Programmers)

[프로그래머스] 가장 큰 수 (Python)

2022. 3. 25. 00:55
 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

문제 설명

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

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

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

제한 사항
  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbers return
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

문제 풀이

프로그래머스 기준 난이도 LEVEL 2문제이다.
처음에 보고 Permutations으로 풀었지만 테스트 케이스 대부분 시간초과로 해결하지 못했다
숫자끼리 묶는 알고리즘을 따로 만들려했지만 실패하고 타 블로그에서 정답을 봤지만 30분동안 봐도 이해가 안갔다

def solution(numbers):
    arr = [str(x) for x in numbers]
    arr.sort(key=lambda x:x*3, reverse=True)
    return str(int("".join(arr)))

숫자를 string 형태의 리스트로 만든 뒤 lambda로 정렬만 하면 되는 문제였다
근데 저 x*3이 도무지 이해가 안가서 한참 찾아보다 겨우 이해했다

문자열 비교연산에서는 첫번째 인덱스를 Ascii숫자로 바꿔서 비교하고, 같을 시 그 다음 인덱스를 Ascii숫자로 변환 후 비교한다고 한다

  • [6, 10, 2]의 경우 reverse로 sort할 경우 [6, 2, 10]을 변환한다
  • [3, 30, 34, 5, 9]의 경우 [9, 5, 34, 30, 3]을 변환한다
  • 하지만 문제의 풀이대로면 3이 30보다 앞으로 와야하니 lambda x: x*3을 이용한다 (numbers의 원소는 1,000이하이기 때문에)
    • [333, 303030]을 비교하면 333의 두 번째 index가 303030보다 Ascii숫자가 크니 333이 앞으로 온다
  • 마지막으로 return할때 "".join(arr)만 하면 몇몇 테스트 케이스 통과가 안된다
    • 찾아보니 0이 중복되는 반례가 있다고한다
    • 따라서 int()로 변환 후 다시 str()으로 바꿔준다

간단한 문제인데 생각보다 시간을 너무 많이 쏟은 것 같다... 
lambda를 이용한 정렬은 많이 연습했는데 string 정렬의 성질에 대해서 생각못했다, 공부 더 해야겠다

GitHub에서 코드 보기

'Algorithms > 프로그래머스 (Programmers)' 카테고리의 다른 글

[프로그래머스] 야근 지수 (Python)  (0) 2022.03.25
[프로그래머스] 주식가격 (Python)  (0) 2022.03.25
[프로그래머스] 베스트앨범 (Python)  (0) 2022.03.25
[프로그래머스] 크레인 인형뽑기 게임 (Python)  (0) 2022.03.23
[프로그래머스] k진수에서 소수 개수 구하기 (Python)  (0) 2022.03.23
    수미니그
    수미니그

    티스토리툴바