https://programmers.co.kr/learn/courses/30/lessons/42746?language=python3
문자열 정렬 문제였는데.. 꽤 오래 걸렸다.. 바본가..
처음 문제 보고 permutations 이용해서 풀어보려고 했다.
생각해보니 너무 불필요한 과정일 것 같았고 결국 또! 다른 사람의 풀이를 찾아다녔다.
여기서 이 문제는 '정렬'이라는 걸 잊고 있었다. 문자열 정렬 성질을 이용했어야했는데 생각도 못했다.
다른 사람들의 풀이를 참고해서 첫번째로 시도한 결과는 채점결과에서 하나가 실패했다.
숫자로 들어오는 numbers를 map을 사용하여 문자열로 바꿔주었다.
바꿔준 문자열을 여러번 반복해서 같은 문자가 반복되는 긴 문자열로 만들어주었고 이 긴 문자열들을 기준으로 내림차순으로 numbers를 정렬하였다.
왜 틀렸을까 곰곰히 생각해보니 numbers에는 숫자 0이 들어올 수도 있다. 그렇게 되면 [0,0,0,0]이 들어오면 join을 했을 때 '0000'이라는 존재할 수 없는 숫자가 되어버리기 때문에 문자열을 다시 int로 바꿔서 str으로 출력을 하도록 해야했다.
두번째 시도 - 성공
def solution(numbers):
answer = ''
num = list(map(str, numbers))
num = sorted(num, key = lambda x: x*3, reverse = True)
return str(int(''.join(num)))
위의 시도에서 lambda식에서 num*6를 해줬는데 두번째 시도에서는 *3을 했다.
처음에는 numbers의 길이는 1 이상 100,000 이하길래 num*6으로 했었는데 *2부터 하나씩 올려보니 *3부터 오류없이 채점이 되었다. 그래서 num*3으로 최종 채점을 했다...ㅇㅅㅇ..
여기서 문자열 정렬은 가장 첫 글자의 크기와 길이로 정렬을 할 수 있다.
문자열의 정렬은 오름차순이 디폴트이기 때문에 a를 그냥 sorted하면 문자열의 길이가 짧은 순서대로 정렬이 된다.
우리의 결과는 내림차순으로 나와야 하기 때문에 a에 2,6,1을 추가해서 내림차순으로 정렬을 하면 맨 앞의 글자가 큰 순서대로 길이 상관없이 정렬이 되는 것을 볼 수 있다.
이 특성을 이용하면 위의 문제도 풀 수 있었던 것이다!