본문 바로가기
코딩테스트/코딩테스트 문제

코딩테스트 준비 - 가장 큰 수: 풀이/2개의 방법 (파이썬)

by 공부가싫다가도좋아 2021. 6. 28.
반응형

가장 큰 수


일단 제가 풀은 방식은, 다른 분들과 조금 다른 풀이입니다. 

다른분들이 사용한 풀이는 제가 생각해낼 수 없는 코드라서, 

효율이 더 안좋더라도, 제가 생각해낼 수 있을만한 방법으로 해결했습니다. 


문제풀러가기

https://programmers.co.kr/learn/courses/30/lessons/42746?language=python3 

 

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

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 합니다.

문제 분석

1. 제한 사항에서 원소는 0 이상 1,000이하 이므로, 각 원소를 4번씩 반속하게 한다.

2. 4번씩 반복하는 이유는 1의 자리부터 천의 자리까지 숫자를 비교해봐야 되기 때문이다.

더보기

예)

[6, 10, 2]

일 경우

6666 1010 2222

천의 자리비교했을때 6이 제일 크므로 6을 앞으로 빼준다

1010 2222 에서

백의 자리를 비교했을때, 0 과 2를 비교하면 2가 더 크므로 

2를 앞으로 빼준다

마지막 남은 10을 뒤에 붙인다.


코드

def solution(numbers):
    number=list(map(str,numbers))
    result=[]
    a=[]
    num=""
    for i in number:
        result.append(int((i*4)[:4]))
    for i,j in zip(result,number):
        a.append((i,j))
    a=sorted(a,key=lambda x:-x[0])
    for j in range(len(a)):
        num+=a[j][1]
    return str(int(num))

코드 풀이

 

def solution(numbers):
    number=list(map(str,numbers)) 
    result=[] #4번 반복되는,길이가 4인 str(숫자)
    a=[] # (반복되는 숫자와, 원래 숫자)가 묶여있는 요소가 담긴 리스트
    num="" #정렬된 숫자를 차례로 넣어주기 위한 변수
    for i in number:
    	#4번 반복하고, 길이가4가 될 수 있도록 잘라줌
        result.append(int((i*4)[:4])) 
        
    for i,j in zip(result,number):
        a.append((i,j)) #  i:새로 만든 숫자  j:원래 숫자
        
    a=sorted(a,key=lambda x:-x[0]) #새로 만든 숫자, x[0]부터 비교
    for j in range(len(a)):
        num+=a[j][1]
    return str(int(num)) 
    # num = "0000"일 수도 있으므로, int로 바꿔준 후 
    #다시 str로 바꿔줌

다른 사람의 코드 

 

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

* 짧지만 제 로직으로는 생각할 수 없습니다 ㅠ_ㅠ...


코드 풀이

1. numbers안의 원소들을 아스키코드로 비교함.

 

 

반응형

댓글