• 문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

 

  • 제한 사항

numbers의 길이는 1 이상 100,000 이하입니다.

numbers의 원소는 0 이상 1,000 이하입니다.

정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

 

  • 입출력 예
numbers return
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

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

코드 풀이

1. numbers에 입력을 받는다.

2. 입력받은 값을 3번씩 곱한다. 문자열이라서 6일경우 666 , 10일경우 101010 ... 로 곱해진다.

-> 3번씩 곱하는 이유 : numbers의 원소가 0이상 1000 이하 이기 때문에

따라서 666, 101010 을 내림차순 정렬하면 문자열이기때문에 666이 앞으로 오게된다.

3. str(int(''.join(numbers))) 여기서 int를 하고 str을 하는 이유는 000일 경우 0으로 바꾸기 위해서이다.

 

입출력 과정

[3, 30, 34, 5, 9] -> [333,303030,343434,555,999] -> [999,555,343434,333,303030]

-> [9,5,34,3,30] -> 9534330

'개발공부 > Problem' 카테고리의 다른 글

SW Expert Academy :: 백만 장자 프로젝트  (0) 2022.02.10

원재의 사재기... 문제는 줄여서 쓰도록 하겠습니다.

    1. 원재는 연속된 N일 동안의 물건의 매매가를 예측하여 알고 있다.
    2. 당국의 감시망에 걸리지 않기 위해 하루에 최대 1만큼 구입할 수 있다.
    3. 판매는 얼마든지 할 수 있다.

 

입력3
3
10 7 6  # 가격이 점점 낮아져서 사지 않는 케이스
3
3 5 9   # 3, 5를 사고 9원일때 팔아서 총 9-3=6, 9-5=4 ,10의 이득을 챙김
5
1 1 3 1 2   # 1,1 을 3에 팔고 1을 2에 판다. 총 5의 이득

 

출력

#1 0
#2 10
#3 5

 

문제이해하는 단계부터 힘든건 뭐지.. 아무튼 위와같은 방식으로 코딩을 하고

  • 시간 : 10개 테스트케이스를 합쳐서 C++의 경우 30초 / Java의 경우 30초 / Python의 경우 30초
  • 메모리 : 힙, 정적 메모리 합쳐서 256MB 이내, 스택 메모리 1MB 이내

위의 조건을 통과 해야함..


T=int(input())
A=[]
for i in range(0,T):
    a = int(input())
    b = input().split()
    A.append(b)               #[[1번째 테스트 날짜별 금액],[두번째  테스트날짜별 금액]]
    

for l,i in enumerate(A):# 
    cnt=0
    for j in range(len(i)):
        if int(i[j]) < int(max(i[j:])): # 순차적으로 뒤에 있는 숫자중 제일 큰 값과 비교
            profit = int(max(i[j:]))-int(i[j]) 
            cnt += profit
    print(f"#{l+1} {cnt}")

 

위와 같이 코딩을 해서 직접 테스트 해보면 잘 되는데..

문제 제출을 하니 런타임 에러가 나오네요..ㅠ 아직 갈길이 멀었네


그래서 참지 못하고 정답자들의 코드를 보았다..

T=int(input())
for i in range(0,T):
    a = int(input())
    b = list(map(int,input().split()))
    money=0
    A = b[len(b)-1]
    for j in range(1,len(b)+1):
        if b[-j] < A:
            money = money + A-b[-j]
        else:
            A = b[-j]
    print(f'#{i+1} {money}')

라고 하네요.. 

메모리 영역 공부좀 더 해야겠다...

'개발공부 > Problem' 카테고리의 다른 글

프로그래머스 :: 가장 큰 수  (0) 2022.02.10

+ Recent posts