본문 바로가기
wecode/TIL 정리

위코드 사전 스터디 3주차 - 3

by 왕거 2020. 7. 1.
# 프로그래머스 코딩 테스트 정렬 파트 - K값 찾기

def solution(array, commands):
    answer = []
    for i in commands :
        temp_array = array[int(i[0] - 1) : int(i[1])]
        print(temp_array)
        temp_array.sort()
        print(temp_array)
        value = temp_array[int(i[2] - 1)]
        print(value)
        answer.append(value)
    
    return answer

파이썬으로 코딩 테스트를 좀 풀어보기로 했다.

 

프로그래머스에서 정렬을 주제로 2문제 정도 풀어봤는데 왜이렇게 어려운지;;;;

 

첫번째 문제였던 지정된 값으로 리스트를 잘라낸 후 지정된 위치의 값을 출력하는 문제는 어찌저찌 풀긴 했는데 다른 사람들 코드를 보니까 생각도 못한 방법으로 풀어내는게 참;;;

 

아직 파이썬 문법에 익숙해지지 않은 점도 있지만 예전에 쓰던 스타일로 코딩을 하는 것 같다.

# 프로그래머스 코딩 테스트 정렬 파트 - K번째수

def solution(array, commands):
    answer = []
    for i in commands :
        temp_array = array[int(i[0] - 1) : int(i[1])]
        print(temp_array)
        temp_array.sort()
        print(temp_array)
        value = temp_array[int(i[2] - 1)]
        print(value)
        answer.append(value)
    
    return answer

너무 단순한게 접근한 것 같다. 통과는 어찌저찌 되긴했다.

 

다른 답변중에 제일 신기했던 거는

 def solution(array, commands):
     return list(map(lambda x:sorted(array[x[0]-1:x[1]])[x[2]-1], commands))

그냥 한 줄로 처리한거였다;;;

 

map, lamdda는 처음 보는 함수였는지라 이 부분에 대한 스터디가 필요하다고 느꼈다.

 

두번째 문제는 문자열로 이루어진 숫자들을 조합해서 가장 큰 수를 반환하는 함수를 만드는 문제였다.

 

이건 결론적으로 못풀었다.

 

처음 생각한 풀이과정은

  1. 순열을 써서 모든 경우의 수를 찾는다
  2. 각각의 경우를 이어 붙인다 (문자열로 처리하니까)
  3. 이어 붙인 값들을 정수로 임시 형변환하여 가장 큰 값을 찾은 후 해당 값을 리턴한다.

코드는 다음과 같다.

# 프로그래머스 코딩 테스트 정렬 파트 - 가장 큰 수

from itertools import permutations

def solution (numbers) :
    answer = []
    value = []
    allways = list(permutations(numbers, len(numbers)))

    for i in allways :
        test = ''
        for j in range(len(numbers)) :
            test = test + '{}'.format(i[j])
        value.append(test)
    answer = max(value)
    return answer

근데 내가 테스트해본 경우는 일단 문제없었는데, 업로드해보니까 작동시간이 문제가 되었다.

 

솔직히 고민을 많이 해본건 아니긴 한데, 어떻게 풀어야 될지 감도 안와서 결국 풀이를 검색해봤다.

def solution(numbers):
    numbers = list(map(str,numbers)) 
    numbers.sort(key=lambda x: x * 3, reverse=True) 
    if sum(list(map(int,numbers))) == 0:
    	numbers = list(set(numbers))
    return "".join(numbers)

여기서도 또 map과 lambda를 발견했다.

 

꽤나 자주 쓰이는 함수라고 느낌

 

가장 중요한 부분은 sort의 key 값으로 주어진 lambda 식인데 진짜 풀이보기 전까지는 저런 식으로 비교를 한다는 건 생각도 못했다. 솔직히 지금도 이해가 잘 안됨;;;

 

원리는 문자열을 비교할 때는 ascii코드 값을 기준으로 진행되는 점의 활용이다.

 

파이썬의 경우 문자열을 곱하게되면 동일한 문자열이 연속되어 연결되는데 이를 사용해서 대소비교 후에 내림차순으로 정렬을 하게 되면 정렬된 순서가 바로 가장 큰 값이 나오는 결과가 된다.

 

아직도 뭔소린지 잘 모르겠다...

 

일단 실습을 통해서 '333'이 '303030'보다 크다라고 판단하는 것을 확인했는데 그래서 그걸 내림차순으로 정렬하면 어떻게 가장 큰 값이 결과로 나오는건지 잘 이해를 못하겠다.