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
- 추천시스템
- hackerrank
- Object Detection
- 프로그래머스
- 튜토리얼
- 코딩테스트
- 나는리뷰어다
- 엘리스
- Image Segmentation
- 큐
- 스택
- 협업필터링
- Recsys-KR
- 한빛미디어
- Segmentation
- Semantic Segmentation
- DFS
- MySQL
- 나는 리뷰어다
- TEAM-EDA
- DilatedNet
- 알고리즘
- eda
- Machine Learning Advanced
- TEAM EDA
- 입문
- pytorch
- Python
- 파이썬
- 3줄 논문
Archives
- Today
- Total
TEAM EDA
[엘리스] 최강의 패 본문
최강의 패
남녀노소 모두가 즐길 수 있는 코더랜드 고유의 전통 놀이가 있습니다. 이 놀이의 이름은 바로 수투!
수투를 즐기는 법은 간단합니다. 자연수로만 이루어진 카드 뭉치에서 일정한 수의 카드를 뽑아 최고로 큰 숫자를 만드는 사람이 이기는 방식입니다.
엘리스와 토끼, 체셔, 모자장수는 둘러앉아 게임 수투를 시작했습니다. 시간이 지나고 엘리스는 계속 지기만 하는 자기 자신을 마주할 수 밖에 없었습니다!
“엘리스 이 바보야. 넌 2, 10, 5 를 받았잖아 그럼 1052이 제일 큰 수가 아니라 5210이 제일 큰 수야.” 체셔가 말했습니다.
“아! 그렇구나.” 엘리스가 답했습니다.
이대로 가다간 엘리스는 한 판도 못 이기겠습니다. 여러분이 엘리스를 도와 최고로 높은 수를 찾아주세요!
입력 예시
5 2 52 100
출력 예시
5522100
입력
- 자연수로 이루어진 숫자(NumberNumber) 리스트가 주어집니다.
- 주어지는 NumberNumber의 길이는 1 ≤ NumberNumber ≤ 1,000 입니다.
출력
- 주어진 숫자(NumberNumber) 리스트로 조합 할 수 있는 숫자 중 가장 큰 숫자를 출력하세요.
- 숫자가 너무 커질 수 있으니 문자열 형태로 출력합니다.
풀이
- 완전탐색을 이용한 풀이
import itertools
# 맨 앞자리가 가장 큰 값중에서 길이가 작은 순서대로 출력
def main():
A = list(map(str, input().split()))
print(str(max(map(int, list(map(''.join, itertools.permutations(A)))))))
if __name__ == '__main__' :
main()
모범 답안
- 완전 탐색의 경우 입력된 데이터의 크기가 너무 커서 에러가 발생할 수 있음
- 모범 답안의 경우 compare라는 정렬 기준을 정해주고, quick sort로 분할해서 정렬
- nums[low] : nums 배열 중에서, 서열이 가장 낮은 것
- nums[l] : 맨 왼쪽에서부터 차례대로, 현재 가리키고 있는 수
- num[r] : 맨 오른쪽의 수
def myQuickSort(nums, l, r):
if l >= r:
return
# pos를 진행하면서 l에서 r까지의 범위가 정렬이 됨 (우선순위 가장 작은게 맨 뒤로 감)
# pos는 nums에서 가장 우선순위가 작은 값
pos = partition(nums, l, r)
# QuickSort는 pos(우선선위가 가장 작은 값)
myQuickSort(nums, l, pos-1)
myQuickSort(nums, pos+1, r)
def partition(nums, l, r):
print(nums, l, r)
low = l
while l < r:
# l + r > r + l 이면
if compare(nums[l], nums[r]):
nums[l], nums[low] = nums[low], nums[l]
low += 1
l += 1
# 가장 낮은 순위 low를 가장 오른쪽 r과 변경
# 여기서 r은 분할정복으로 들어왔기에 들어온 값중에서 마지막임
nums[low], nums[r] = nums[r], nums[low]
return low
def compare(n1, n2):
return str(n1) + str(n2) > str(n2) + str(n1)
nums = input().split()
nums = [int(i) for i in nums]
myQuickSort(nums, 0, len(nums)-1)
print(str(int("".join(map(str, nums)))))
출처 : 엘리스 아카데미, https://academy.elice.io/learn
'EDA Study > 알고리즘' 카테고리의 다른 글
[엘리스] 숫자놀이 (0) | 2020.03.27 |
---|---|
[엘리스] 흰토끼의 장사하자 (0) | 2020.03.26 |
[엘리스] 엘리스와 비밀번호 (0) | 2020.03.26 |
[엘리스] 회의실 준비 (Big) (0) | 2020.03.25 |
[엘리스] 가장 가까운 두 점 찾기 (Big) (0) | 2020.03.25 |