로직
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 |