Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 백준 14499
- 완주하지 못한 선수
- A와 B
- 키패드 누르기
- 빙산
- 움직이는 미로 탈출
- 백준16954
- 로또의 최고 순위와 최저 순위
- 프로그래머스
- 백준2573
- 인구 이동
- 피보나치 수의 확장
- 백준1339
- 백준 2564
- 경비원
- 소수 만들기
- 파이썬
- 124 나라의 숫자
- 부스트캠프
- 전기 요금
- Smart Commit
- 백준16234
- 백준1697
- 백준5710
- 단어 수학
- 백준3190
- 코딩테스트
- 백준
- 백준12904
- 백준1788
Archives
- Today
- Total
Today.dev
[PG_42746/Python] 가장 큰 수 본문
문제
틀린 풀이
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: (len(x), -int(x))) #1
return ''.join(numbers) #2
1. 리스트를 자릿수가 짧고 큰 숫자 순서로 정렬(#1)했는데 틀린 정렬 조건이다.
2. 리스트를 단순히 str로 합치는 코드(#2)는 "000"과 같은 출력을 만들 수 있다.
맞은 풀이
from functools import cmp_to_key
def comparator(s1, s2): #1
a = s1 + s2
b = s2 + s1
if a == b:
return 0
if a > b:
return 1
if a < b:
return -1
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=cmp_to_key(comparator), reverse=True)
return str(int(''.join(numbers))) #2
1. 정렬 기준을 lambda로 만들기 힘들다고 생각해서 Java처럼 comparator(#1)를 만들었다. 커스텀 함수를 정렬 기준으로 처음 제공해봤는데 key=comparator처럼 직접 함수를 제공하면 컴파일 에러가 발생했다. functools 모듈의 cmp_to_key 함수를 이용해야 한다.
2. "000" 처럼 숫자로 옳지 않은 결과를 만들지 않기 위해 일부러 join의 결괏값을 정수로 변환한 후 다시 문자로 변환하는 과정(#2)을 거친다.
다른 풀이
# 1.
import functools
def comparator(a,b):
t1 = a+b
t2 = b+a
return (int(t1) > int(t2)) - (int(t1) < int(t2)) # t1이 크다면 1 // t2가 크다면 -1 // 같으면 0
def solution(numbers):
n = [str(x) for x in numbers]
n = sorted(n, key=functools.cmp_to_key(comparator),reverse=True)
answer = str(int(''.join(n)))
return answer
다른 사람의 풀이를 봤더니 유사한 풀이가 있었다. comparator 함수의 return 코드에서 1 = True, 0 = False 란 사실을 이용해서 위와 같은 코드를 작성하셨다.
# 2.
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x*3, reverse=True)
return str(int(''.join(numbers)))
숫자의 최소 자릿수를 세 자릿수로 만들어서 비교하는 코드이다. 개인적으로 numbers 원소의 최댓값이 1,000 이기 때문에 4를 곱해야 하는 게 아닌가 생각했었는데, 어차피 네 자릿수는 1,000 하나밖에 없고 그마저도 0을 제외하면 우선순위가 최저라 3을 곱해도 괜찮은 것 같다.
참고
1. 다른 사람의 풀이
2. 파이썬 문서
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[PG_49189/Python] 가장 먼 노드 (1) | 2021.07.03 |
---|---|
[PG_12899/Python] 124 나라의 숫자 (0) | 2021.07.03 |
[PG_67256/Python] 키패드 누르기 (0) | 2021.06.22 |
[PG_77484/Python] 로또의 최고 순위와 최저 순위 (0) | 2021.06.22 |
[PG_42576/Python] 완주하지 못한 선수 (0) | 2021.06.22 |
Comments