본문 바로가기

CodingTest/Programmers

[ 프로그래머스 ] 가장 큰 수

첫 제출 전에 이 방법 저 방법 시도하다보니 다시 익히는 것들이 많아서 정리하고자 먼저 적습니다.

 

1. 딕셔너리를 키 기준으로 정렬하기 (여기서는 정렬 순서 반대로 옵션도 줬습니다.)

dic = dict(sorted(dic.items(), reverse=True))

 

2. join 함수 사용 ( list to str join)

https://stackoverflow.com/questions/12453580/how-do-i-concatenate-items-in-a-list-to-a-single-string

 

1)

>>> sentence = ['this', 'is', 'a', 'sentence']
>>> '-'.join(sentence)
'this-is-a-sentence'
>>> ' '.join(sentence)
'this is a sentence'

answered Sep 17, 2012 at 5:33  by Burhan Khalid

:  sep이 함수 안에 파라미터로 주어질 줄 알았는데 이렇게 구현된다니 의외였습니다. 유용하게 쓰일 수 있을 것 같으니 알아둡시다.

2)

A more generic way to convert python lists to strings would be:

>>> xs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> ''.join(map(str, xs))
'12345678910'

answered Dec 1, 2015 at 3:11  by  Aaron S

: 유용할 것 같은 join 과 map의 사용! 기억해두기~ 대댓글에는 map에 람다식이나 함수로 더 구체적으로 구현할 수 있는 예제도 제시되어 있습니다 :-)
 
 
 
 
 
 

 

충분히 고민하는 것도 좋지만 한 문제에 과하게 시간을 쏟을 여유는 없어 그러지 않으려고 했습니다.

그러나 오기가 생겨서 3시간 반을 붙잡고 있다가 포기했습니다.

 

정말 쉽게도 구현했다가 진짜 딥하게도 들어갔다가 포기한 코드도 작성하고 오류 체크하고 다른 분들 코드 풀이까지 했는데 그마저도 저장단계에서 날아가 다시 작성합니다..

 

이 문제 시작부터 정리에만 5시간 걸리는 것 같네요.

 
 

/  다른 분들 풀이  /

 

1)

def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x*3, reverse=True)
    return str(int(''.join(numbers)))

 

- numbers 배열의 int type인 각 값을 str으로 바꿔줍니다. 

: int type과 달리 문자열은 ASCII값을 기준으로 각 인덱스를 기준으로 서로 비교하기에 결과값이 차이를 보입니다.

  ex) [ 3, 30, 9 ] 가 있을 때, [ 3, 30, 9 ].sort( reverse = True)  => [ 30, 9, 3 ]

        [ '3', '30', '9' ] 가 있을 때, [ '3', '30', '9' ].sort( reverse = True) => [ "9", "30", "3" ]

 

- key를 lambda x: x * 3 의 람다식으로 sort 함수를 사용해 정렬합니다.

 : 이는 문제에서 각 인수가 1000이하라는 제한사항을 이용한 아이디어였습니다. 

   프로그래머스에서 해당 풀이에 달린 답댓글을 보면 이해가 더 쉽습니다.

  • 궁금한게 저 방식과 끝 수를 늘려서 자리수를 맞춰 비교하는 것과 무슨 차인가요? 예를 들어 [22,23,223] -> ["222", "233", "223"]
  •  
  • 끝 수를 늘려서 자리수를 맞춰 비교하게 되면 233과 23의 경우에는 두 수 모두 2333이 되므로 같다고 판단하여 이동을 하지 않는 것 같습니다. 따라서 [233,23]이 들어온 경우에는 "23323" 이 되지만 [23,233]이 들어오는 경우에는 "23233" 이라는 결과가 나오게 됩니다.

- 마지막 값을 int 로 바꾼 뒤 다시 str 로 변경하는 이유는 예외 케이스 000때문입니다. 문자열로 출력하기에 ''000" 의 오류값이 나올 것을 방지해 "0"으로 올바르게 나오도록 int 형식으로 한 번 바꿔주고 되돌려 주는 것입니다.

 

 

2) 

import functools

def comparator(a,b):
    t1 = a+b
    t2 = b+a
    return (int(t1) > int(t2)) - (int(t1) < int(t2)) #  t1이 크다면 1  // t2가 크다면 -1  //  같으면 0

def solution(numbers):
    n = [str(x) for x in numbers]
    n = sorted(n, key=functools.cmp_to_key(comparator),reverse=True)
    answer = str(int(''.join(n)))
    return answer

해당 풀이에서는 처음 보는 라이브러리+메서드가 있어서 재밌었습니다. 아직 모르는게 많은 것 같아 부끄럽기도 했습니다.

functools.cmp_to_key 에 대해 정리하고 갑시다.

functools.cmp_to_key     

functools.cmp_to_key(func)는 sorted()와 같은 정렬 함수의 key 매개변수에 함수(func)를 전달할 때 사용하는 함수이다. 단, func() 함수는 두 개의 인수를 입력하여 첫 번째 인수를 기준으로 그 둘을 비교하고 작으면 음수, 같으면 0, 크면 양수를 반환하는 비교 함수이어야 한다.               from. https://wikidocs.net/109303

 

해서 해당 코드에서는 comparator 함수를 functools.cmp_to_key 안에 인자로 넣어 해당 함수 내용을 key 값 기준으로 정렬하게 한 것입니다.

 

comparator 안에서 a, b로 들어온 문자열 타입의 두 값을 그 순서대로 합하고, 순서를 바꿔 합한 두 가지 케이스를 정수 타입으로 변환해 어떤 게 더 클 지 비교합니다. 더 큰 값을 만들 순서일 때 1을 반환, 반대일 때 -1을 반환, 두 값이 같을 때 0을 반환 가능하도록 구현해줬습니다.

 

유용하게 쓰일 것 같으니 익혀두고 갑시다 !!

'CodingTest > Programmers' 카테고리의 다른 글

[ 프로그래머스 ] 체육복  (0) 2022.06.21
[ 프로그래머스 ] H-index  (0) 2022.06.21
[ 프로그래머스 ] K번째 수  (0) 2022.06.21
[ 프로그래머스 ] 더 맵게  (0) 2022.06.20
[ 프로그래머스 ] 프린터  (0) 2022.06.20