처음에는 원소의 나머지 값을 구해서 그 값을 비교해 바꾸는 작업을 했는데
numbers원소가 2자리수 일 경우까지만 고려했기 때문에 문제를 해결할 수 없었다.
초기 작성 코드 (
엉망진창) => 20.0 점def solution(numbers): newNumbers = list(map(str, numbers)) newNumbers.sort(reverse=True) remainder =[] # 나머지 for i in newNumbers: remainder.append(int(i)%10) for i in range(len(remainder)-1): if remainder[i]< remainder[i+1]: tmp = newNumbers[i+1] newNumbers[i+1] =newNumbers[i] newNumbers[i] = tmp print(newNumbers) result = "".join(newNumbers) return result
출처 : https://ooyoung.tistory.com/59
정렬 기준은 문자열은 알파벳, 가나다순이고 숫자는 오름차순이 기본값
parameter : key, reverse
key : 정렬을 목적으로 하는 함수를 값으로 넣는다. lambda를 이용할 수 있다. key 값을 기준으로 정렬되고 기본값은 오름차순
str_list = ['좋은하루','good_morning','굿모닝','niceday']
print(sorted(str_list, key=len)) # 함수
>> ['굿모닝', '좋은하루', 'niceday', 'good_morning']
print(sorted(str_list, key=lambda x : x[1])) # 람다
>> ['niceday', 'good_morning', '굿모닝', '좋은하루']
개선한 코드
def solution(numbers): numbers=list(map(str,numbers)) #numbers의 인수값이 1000 이하이므로 3자리수로 맞춘 뒤 비교 #문자열 비교는 ASCII 값으로 치환되어 정렬 numbers.sort(key = lambda x: x*3, reverse=True) #print(numbers) return str(int(''.join(numbers)))
의문점
str(int(''.join(numbers))) 이 아니라 ''.join(numbers)로 하는 경우 테스트11번에서 실패가 나온다
numbers의 요소들은 모두 str인데, int로 형변환하고 다시 str로 변환시키는 이유는 뭘까?
c언어처럼 문자열의 끝에 '종료 문자'인 하는 걸까?
=> 결론적으로 이러한 추측은 틀렸다!
모든 값이 0일 때(즉, ‘000’을 처리하기 위해) int로 변환한 뒤, 다시 str로 변환한다.
int로 변환하지 않으면 '000'이 리턴되는데 이는 원하는 답 '0'과 다르다.