[정렬] 프로그래머스 Lv.2 가장 큰 수 - Python

2024. 3. 16. 02:03· Algorithm/Programmers
목차
  1. 🗂️ 문제
  2. 💡 접근법
  3. 😎 내 코드
  4. 👀 배운 코드
  5. 🧐 배운 점
  6. 🔗 Reference

🗂️ 문제

링크: https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

💡 접근법

numbers 리스트 내 값들의 자릿수를 3자리로 맞춘다. 자릿수를 맞출 때 부족한 자릿수만큼 첫 번째 자리에 해당하는 수로 채운다.

즉 numbers=[3, 30, 34, 5, 9] → numbers=[333, 303, 343, 555, 999]가 된다.

이를 정렬하면 numbers = [999, 555, 343, 333, 303]이다. 이것의 원래 값을 이어붙여서 출력하면 answer = “9534330”이다.

 

하지만 위의 해결방식에는 numbers=[3, 30, 303]라는 반례가 존재한다.

위의 방식대로 적용할 경우 정렬 결과는 numbers=[333, 303, 303]이 된다. 이때 동일한 값이 존재하기 때문에 우선순위를 지정해야 한다. 즉 원래 값을 두 번째 정렬 조건으로 지정한다. 즉 정렬 결과는 numbers=[333(3), 303(303), 303(30)]이다. 이를 출력하면 answers=”330330”이 된다.

 

하지만 이 방식 또한 numbers=[14, 141]라는 반례가 존재한다.

따라서 부족한 자릿수를 값의 첫 번째 자리로 채우는 것이 아니라 값을 3번 반복하는 방식을 통해 채워야 한다.

즉 numbers=[14, 141] → numbers=[141414, 141141141]이 되고, 이를 정렬하면 numbers=[141414, 141141141]이고 answer=”14141”이다.

 

😎 내 코드

  • 시도 1 - 반례: [3, 30, 303]
def solution(numbers):
    answer = ''
    
    new_n = []
    for num in numbers:
        s_num = str(num)
        digit4_num = s_num + s_num[0] * 3
        new_n.append((s_num, digit4_num))
    
    new_n.sort(key=lambda x: (x[1]), reverse=True) 
    
    for n in new_n:
        answer += n[0]
        
    return answer
  • 시도 2 - 반레: [14, 141]
def solution(numbers):
    answer = ''
    
    new_n = []
    for num in numbers:
        s_num = str(num)
        digit4_num = s_num + s_num[0] * 3
        new_n.append((s_num, digit4_num))
    
    new_n.sort(key=lambda x: (x[1], x[0]), reverse=True) 
    
    for n in new_n:
        answer += n[0]
        
    return answer

 

👀 배운 코드

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

return 시 str(int(answer))을 하는 이유는 [0, 0]에 대한 반례를 해결하기 위함이다.

 

🧐 배운 점

  1. numbers 리스트 내 요소 str로 변환
    numbers = list(map(str, numbers))
  2. 정렬할 대상이 되는 리스트를 새로 생성하지 않고 lambda 식 안에서 정렬할 값을 생성한 뒤 정렬
    numbers.sort(key=lambda x: x*3, reverse=True)
  3. 리스트 내 문자열 하나로 합치기
    answer = ''.join(numbers)

 

🔗 Reference

 

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

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

liveloper-jay.tistory.com

 

'Algorithm > Programmers' 카테고리의 다른 글

[완전탐색] 프로그래머스 Lv2. 카펫 - Python  (0) 2024.03.21
[완전탐색] 프로그래머스 Lv1. 모의고사 - Python  (0) 2024.03.19
[힙] 프로그래머스 Lv2. 더 맵게 - Python  (0) 2024.03.07
[스택/큐] 프로그래머스 Lv1. 같은 숫자는 싫어 - JAVA  (0) 2024.02.19
[SQL] 프로그래머스 SELECT 문제 풀이  (1) 2024.02.19
  1. 🗂️ 문제
  2. 💡 접근법
  3. 😎 내 코드
  4. 👀 배운 코드
  5. 🧐 배운 점
  6. 🔗 Reference
'Algorithm/Programmers' 카테고리의 다른 글
  • [완전탐색] 프로그래머스 Lv2. 카펫 - Python
  • [완전탐색] 프로그래머스 Lv1. 모의고사 - Python
  • [힙] 프로그래머스 Lv2. 더 맵게 - Python
  • [스택/큐] 프로그래머스 Lv1. 같은 숫자는 싫어 - JAVA
jyjyjy25
jyjyjy25
jyjyjy25
기록하는 습관
jyjyjy25
전체
오늘
어제
  • 분류 전체보기 (148)
    • Algorithm (87)
      • Baekjoon (59)
      • Programmers (28)
    • Courses (18)
      • Java (3)
      • Spring (11)
      • JPA (4)
    • CS (7)
    • DevOps (8)
      • AWS (8)
    • Framework (10)
      • Spring (5)
      • JPA (5)
    • Security (13)
      • Web Hacking (10)
      • Dreamhack (0)
      • ISMS (3)
    • Research (1)
    • Etc (4)

인기 글

최근 글

hELLO · Designed By 정상우.v4.2.1
jyjyjy25
[정렬] 프로그래머스 Lv.2 가장 큰 수 - Python
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.