*문제 출처는 프로그래머스에 있습니다.
문제 제목: 가장 큰 수 (2단계)
문제 사이트: https://school.programmers.co.kr/learn/courses/30/lessons/42746#
문제 설명
나의 풀이
def my_asc(lst):
for n in range(len(lst) - 1):
for m in range(n + 1, len(lst)):
if len(lst[n]) > 1 and len(lst[m]) > 1 and lst[n][0] == lst[m][0]:
if lst[n][1] < lst[m][1]:
lst[n], lst[m] = lst[m], lst[n]
elif lst[n][1] == lst[m][1]:
if lst[n][2] < lst[m][2]:
lst[n], lst[m] = lst[m], lst[n]
elif lst[n][2] == lst[m][2]:
if lst[n][3] < lst[m][3]:
lst[n], lst[m] = lst[m], lst[n]
if lst[n][0] < lst[m][0]:
lst[n], lst[m] = lst[m], lst[n]
def solution(numbers):
answer = ''
str_numbers = list(map(str, numbers))
my_asc(str_numbers)
for i in str_numbers:
answer += i
answer = int(answer)
answer = str(answer)
return answer
처음 풀이는 규칙을 만들고 풀었다.
1. 첫 번째 자릿수의 크기가 큰 친구가 앞으로 간다.
2. 만약 두 자릿수 이상이면서 첫 번째 자리수의 크기가 같을 경우 뒤에 오는 자릿수의 크기를 비교해가며 정렬하려고 했다.
3. "00"이 입력되면 "0"으로 출력해야 하므로 정수로 바꾸고 다시 문자열로 바꾼다.
이렇게 풀 경우 시간초과가 되는 모습을 볼 수 있다.
하지만 위에 있던 풀이를 통해 알게된 사실이 있다.
a = ["9191", "999", "9292", "9393", "9494"]
a.sort(reverse = True)
print(a)
# 결과값
# ['999', '9494', '9393', '9292', '9191']
# 비교할 때는 '999', '949', '939', '929', '919' 이 상태에서 비교함
문자열에서 정렬을 하게되면 배열 중 가장 작은 문자열을 기준으로 정렬한다는 사실을 알게 되었다.
def solution(numbers):
answer = ''
str_numbers = list(map(str, numbers))
str_numbers.sort(key = lambda x: x * 3, reverse = True)
for i in str_numbers:
answer += i
answer = int(answer)
answer = str(answer)
return answer
그 성질을 이용하여 배열의 원소들을 3번씩(어차피 자릿수는 1000으로 제한되기 때문에 3번만 곱해줘도 된다) 곱해주고 역순으로 배열 했다.
※ 알아야 할 것
(중요)sort(key = 람다식)을 사용하면 내가 원하는 방식으로 원소들을 정렬할 수 있다.
https://kingofbackend.tistory.com/98
'코딩테스트(프로그래머스 & 백준) > 프로그래머스-Python' 카테고리의 다른 글
Programmers / 124 나라의 숫자 / Python (0) | 2024.04.11 |
---|---|
Programmers / 점 찍기 / Python (0) | 2024.04.09 |
Programmers / 오픈채팅방 / Python (1) | 2024.04.05 |
Programmers / 정수 삼각형 / Python (0) | 2024.04.04 |
Programmers / 롤케이크 자르기 / Python (0) | 2024.04.03 |