본문 바로가기
ALGORITHM/PROGRAMMERS

[PG/Python] 가장 큰 수

by 안녕나는현서 2021. 8. 18.
728x90

📌 문제

https://programmers.co.kr/learn/courses/30/lessons/42746

 

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

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

📌 문제 접근 방법

  1. 처음 시도 : 모든 숫자의 조합을 다 만든 다음, 정렬해서 비교
  2. 그런데 모든 숫자의 조합을 어떻게 만들까 고민하다보니 굳이 만들 필요가 없었던 것!
    맨 처음부터 리스트를 내림차순 정렬한 후, 모두 이어붙이면 된다.
    대신, 숫자의 절대적인 크기 기준이 아니라 이어붙였을 경우 커지는 걸 생각하면서 정렬을 해야해서 이 부분은 많이 고민했다.
  3. 디버깅 하다보니 코드가 지저분해진데다가 그럼에도 불구하고 계속 테스트케이스 1~6번이 틀렸다고 뜬다. 😭

 

결국 지금은 포기... 나중에 다시 도전해보기!

 

📌 코드

def solution(numbers):
    # 3/30/34를 비교할 경우, 33/30/34를 비교하는 것과 마찬가지
    # [0]이 3일 경우 뒤에 무조건 3이 오므로!
    # 같은 맥락으로 100의 자리일 경우도 고려해서 비어있는 자리를 [0]으로 다 채우기
    temp = {} # {원래 값_개수 : 바뀐 값}
    cnt = 1
    for number in numbers:

        if number < 10:
            if f'{number}_{cnt}' in temp.keys():
                cnt += 1
            temp[f'{number}_{cnt}'] = number*100 + number*10 +number
        elif number < 100:
            if f'{number}_{cnt}' in temp.keys():
                cnt += 1
            temp[f'{number}_{cnt}'] = number*10 + (number//10)
        else :
            if f'{number}_{cnt}' in temp.keys():
                cnt += 1
            temp[f'{number}_{cnt}'] = number
    
    temp_itm = temp.items() # dict_items([('3_1', 333), ('21_1', 212), ('546_1', 546), ('1000_1', 1000)])
    
    # value값을 기준으로 내림차순 정렬
    temp_itm = sorted(temp_itm, key= lambda x : x[1], reverse=True)

    # key만 새로운 리스트에 저장
    temp_key = []

    for key_value in temp_itm:
        temp_key.append(key_value[0].split('_')[0])

    # 만약 temp_key에 1000이 들어가 있다면 0이 없을 경우 제일 뒤,
    # 0이 있을 경우 0의 바로 앞에 위치해야 함
    if '1000' in temp_key:
        temp_key.remove('1000')
        temp_key.append('1000')
    
    if '0' in temp_key:
        temp_key.remove('0')
        temp_key.append('0')

    answer = ''.join(temp_key)

    total = 0
    for ans in answer:
        total += int(ans)
    
    if total == 0:
        answer = '0'

    return answer

numbers = [2, 20, 200]
print(solution(numbers))
728x90

'ALGORITHM > PROGRAMMERS' 카테고리의 다른 글

[PG/Python] 전력망을 둘로 나누기  (0) 2021.11.14
[PG/Python] 타겟 넘버  (0) 2021.11.04
[PG/Python] 문자열 압축  (0) 2021.11.03
[PG/Python] 모의고사  (0) 2021.08.21
[PG/Python] K번째수  (0) 2021.08.16

댓글