https://school.programmers.co.kr/learn/courses/30/lessons/42746
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
아이디어
처음에는 전체 자릿수를 구하고, 각 자릿수를 구하는 방법으로 풀었다.
구하는 자릿수 만큼 0을 채워넣어서 비교하는 방법을 사용했는데, 시간초과가 나서 구글링을 해서 비교 방법을 찾았다.
비교 방법: 문자열 * 3
구글에서 찾은 비교 방법은 문자열*3을 이용하는 거였다.
예시에 있는 [3, 30, 34, 5, 9]의 경우 ["333", "303030", "343434", "555", "999"] 가 되는데, 이를 사전순으로 정렬하면, ["999", "555", "343434", "333", "303030"] 이 된다.
비교가 까다로웠던 34, 3, 30 의 자릿수를 맞춰주면서 정렬이 깔끔하게 되는 방법이다.
*3을 해주는 이유는 전제 조건이 아래와 같았기 때문이다.
- numbers의 원소는 0 이상 1,000 이하입니다.
처음에는 numbers의 원소가 1000이하이니까 *4가 되어야 하지 않을까? 생각했다. 그런데 1000과 비교해서 더 낮은 우선순위를 가질 값이 없다는 걸 알았다. (0을 제외하고)
만약 [1000, 1, 10 ,100]이 들어있다고 가정해도, *3 후 정렬하면 [111, 101010, 100100100, 100010001000]로 제대로 정렬된다.
테스트 케이스 11번: "0000" 출력 시 "0"이 출력되어야 한다.
처음 return할 때 "".join(numbers)로 찾은 순서대로 그냥 리턴을 해주었는데, 테케 11번에서 계속 오류가 났다.
그래서 찾아보니, "00"과 같이, 0이 중복해서 나오는 경우, "0" 으로 출력해주어야 했다.
이를 해결하기 위해 합친 문자열을 int로 바꿨다가(0 여러개 제거) 다시 string으로 변경해주었다.
return str(int("".join(numbers)))
전체 코드
def solution(numbers):
if len(numbers) == 1: return str(numbers[0])
numbers = list(map(str, numbers))
numbers.sort(key = lambda x: x*3, reverse = True)
return str(int("".join(numbers)))
코드는 짧지만, 풀이 방법이 신기해서 좋았다. 사전순으로 정렬과 문자열 곱하기를 제대로 응용해본 것 같아서 뿌듯하다.
'Coding Test > Python' 카테고리의 다른 글
[프로그래머스] H-Index (level2, python) (0) | 2024.01.16 |
---|---|
[프로그래머스] 주식가격 (level2, python) (0) | 2024.01.16 |
[프로그래머스] K번째수 (level1, python) (0) | 2024.01.16 |
[프로그래머스] 이중우선순위큐 (level3, python) (0) | 2024.01.16 |
[프로그래머스] 디스크 컨트롤러 (level3, python) (1) | 2024.01.16 |