일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 팀 분석
- 노코드AI
- 캐글
- Brightics
- 영상제작기
- 직원 이직률
- 혼공
- 혼공학습단
- 개인 의료비 예측
- 혼공머신
- 혼공머신러닝딥러닝
- 삼성SDS Brightics
- 브라이틱스 서포터즈
- 삼성 SDS
- Brigthics
- 삼성SDS
- 포스코 청년
- Brigthics Studio
- 데이터분석
- 모델링
- 데이터 분석
- 직원 이직여부
- Brightics를 이용한 분석
- 삼성SDS Brigthics
- 브라이틱스
- 추천시스템
- Brigthics를 이용한 분석
- 포스코 아카데미
- 삼성 SDS Brigthics
- Brightics Studio
- Today
- Total
데이터사이언스 기록기📚
[프로그래머스] Level 2_가장 큰 수(정렬) 본문
문제 유형
정렬
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 문제 풀이
1차 시도(26.7, 나머지 시간 초과)
from itertools import permutations
def solution(numbers):
answer = ''
str_number = []
num = list(permutations(numbers, len(numbers)))
for i in range(len(num)):
num_str = list(map(str,num[i]))
str_number.append(''.join(num_str))
max_num = list(map(int,str_number))
return str(max(max_num))
2차 시도(33.3)
def solution(numbers):
answer = ''
str_number = []
num_str = list(map(str,numbers))
num_str.sort(reverse = True)
return ''.join(num_str)
3차 시도(40, 5개 시간초과)
def solution(numbers):
answer = ''
list_to_sort = []
# 만약 맨 앞 숫자가 같으면 같은거끼리 다시 큰 수로 정렬한다
# 맨 앞 숫자를 비교해서 큰 수로 정렬한다
numbers = sorted(list(map(str,numbers)),reverse = True)
max_num = ''.join(numbers)
for i in range(len(numbers)):
if numbers[i][0] == numbers[i-1][0]:
# swap 해보고 join한 것과 안하고 join한거 비교
numbers[i-1], numbers[i] = numbers[i], numbers[i-1]
make_num = ''.join(numbers)
if make_num > max_num:
max_num = make_num
return max_num
4차 시도(33.3, 1개 시간초과)
def solution(numbers):
answer = ''
list_to_sort = []
# 만약 맨 앞 숫자가 같으면 같은거끼리 다시 큰 수로 정렬한다
# 맨 앞 숫자를 비교해서 큰 수로 정렬한다
numbers = sorted(list(map(str,numbers)),reverse = True)
max_num = ''.join(numbers)
for i in range(len(numbers)):
if numbers[i][0] == numbers[i-1][0] and numbers[i]+'0' == numbers[i-1]:
# swap 해보고 join한 것과 안하고 join한거 비교
numbers[i-1], numbers[i] = numbers[i], numbers[i-1]
make_num = ''.join(numbers)
if make_num > max_num:
max_num = make_num
return max_num
-> 결국 다른 사람의 문제 풀이를 사용
다른 사람의 문제풀이
1) 조건 피하기 위해 3배 곱해서 정렬
- 문자열로 변환 후 3을 곱한 값을 역순으로 정렬
- numbers 원소는 0이상, 1000이하 조건을 피하기 위해 3을 곱함(문자열 곱 ["30"] -> ["303030"]
- 파이썬 문자열 정렬 : 아스키 코드 값을 기반으로 정렬(숫자의 앞자리가 큰 수부터 정렬)
[프로그래머스] 가장 큰 수(python)
Programmers, 가장 큰 수 TL;DR 정렬(sort) 문제 요약 1. 주어진 0 또는 양의 정수들을 이어 붙여서 만들 수 있는 수 중 가장 큰 수를 반환한다. - 입력으로 주어진 수들을 순서를 다르게 배치하여 여러 다
firsteast.tistory.com
def solution(numbers):
answer = ''
numbers = list(map(str, numbers))
numbers.sort(key=lambda x : x*3, reverse = True)
return str(int(''.join(numbers)))
2) functools.cmp_to_key 사용
- cmp_to_key(func) : 정렬함수 key로 함수 전달할 때 사용
- func(a,b) : a를 기준으로 a,b 비교하고 작으면 -1, 같으면 0, 크면 +1 반환하는 비교 함수
029 순서대로 좌표를 정렬하려면? ― functools.cmp_to_key
functools.cmp_to_key(func)는 sorted()와 같은 정렬 함수의 key 매개변수에 함수(func)를 전달할 때 사용하는 함수이다. 단, func() 함 ...
wikidocs.net
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
리뷰
- 순열을 이용하면 시간복잡도가 커서 시간초과 -> 순열은 사용하지 않는 것이 좋음
[Python] 순열(Permutation)과 조합(Combination) 구하기 - itertools
오늘은 itertools를 활용한 배열의 순열(Permutation)과 조합(Combination)을 계산하는 방법을 소개한다. 1. 순열(Permutation) 2. 조합(Combination) 1. 순열(Permutation) - itertools.permutations 순열은 특..
zephyrus1111.tistory.com
- 조건을 피해서 만들어보기
'Coding Test > 프로그래머스(Python)' 카테고리의 다른 글
[프로그래머스] Level2_위장(해시) (0) | 2022.09.24 |
---|---|
[프로그래머스] Level 2_H-Index(정렬) (0) | 2022.09.22 |
[프로그래머스] Level 2_다리를 지나는 트럭(스택/큐) (0) | 2022.09.17 |
[프로그래머스] Level 2_올바른 괄호(스택/큐) (0) | 2022.09.08 |
[프로그래머스] Level 2_주식가격(스택/큐) (1) | 2022.09.08 |