본문 바로가기

알고리즘

[programmers] 가장 큰 수


로직

1. 숫자마다 첫번째 오는 숫자가 큰 것부터 나열하면 된다 -> [6, 10, 2, 11]이면 [6, 2, 11, 10]이 되도록.

   - 처음에는 하나하나 비교하려했는데,, 쉽지 않을것같아서 자리수를 맞추고 비교하려고 한다.

   - numbers의 원소가 0이상 1000이하이니까 만단위로 바꾸기

   - 이후 sort해서 join으로 붙이기

 

코드

def solution(numbers):
    numbers = list(map(str, numbers))

    check = []

    if ''.join(numbers) == '0' * len(numbers):
        # print('yes')
        return '0'

    for number in numbers:
        if len(number) == 4:
            check.append((number, number * 3))

        elif len(number) == 3:
            check.append((number, number * 4))

        elif len(number) == 2:
            check.append((number, number * 6))

        elif len(number) == 1:
            check.append((number, number * 12))

    temp = sorted(check, key=lambda x: x[1], reverse=True)

    answer = ''
    for t in temp:
        answer += t[0]

    return answer

 

주의할 점

1.  ** 문제점 : numbers = [2, 20, 220]일 때, 2 20이 동일하게 나옴 -> 2, 20, 220이면 2 > 220 > 20 가 올바른 것
     if len(number) == 4:
         num = number + '0' * 1
         check.append((number, num))

    ** 해결책 -> 222222, 202020, 220220 -> 2 > 220 > 20순서로 나온다
    if len(number) == 4:
        check.append((number, number * 3))

 

2.  ** 문제점 : 0000이 아니라 0으로 나와야한다.
    ** 해결책
      if ''.join(numbers) == '0' * len(numbers):
          # print('yes')
          return '0'

이 조건을 추가한다.

 


다른 사람의 풀이

1. 나와 같은 로직이지만, 더 간단하게

def solution(numbers):
    numbers = list(map(str, numbers))
    answer = "".join(sorted(numbers, key=lambda x: (x[0], x[1%len(x)], x[2%len(x)], x[3%len(x)]),reverse=True))
    return answer if int(answer) != 0 else "0"

2. 정렬을 함수로 만들어 푸는 방식 있음

'알고리즘' 카테고리의 다른 글

[baekjoon] 3190. 뱀  (0) 2020.08.12
[programmers] 카카오프렌즈 컬러링북  (0) 2020.08.11
[programmers] 문자열 압축  (0) 2020.08.11
[programmers] 소수찾기(12921)  (0) 2020.07.08
[programmers] 문자열 다루기 기본  (0) 2020.07.08