프로그래머스 고득점kit 정렬(Sort) - 가장 큰 수 (level2)

j_wisdom_h·2022년 10월 8일
0

CodingTest

목록 보기
5/58
post-thumbnail

정렬(Sort) - 가장 큰 수(level2)

1. 문제 설명


2. 제한사항, 입출력 예

3. 해결

처음에는 원소의 나머지 값을 구해서 그 값을 비교해 바꾸는 작업을 했는데
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

4. 개선

출처 : https://ooyoung.tistory.com/59

Sort()

  • 정렬 기준은 문자열은 알파벳, 가나다순이고 숫자는 오름차순이 기본값

  • 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', '굿모닝', '좋은하루']
  • reverse : 기본값은 reverse=False(오름차순), reverse = True(내림차순)

개선한 코드

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'과 다르다.

profile
뚜잇뚜잇 FE개발자

0개의 댓글