# 프로그래머스 코딩 테스트 정렬 파트 - 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는 처음 보는 함수였는지라 이 부분에 대한 스터디가 필요하다고 느꼈다.
두번째 문제는 문자열로 이루어진 숫자들을 조합해서 가장 큰 수를 반환하는 함수를 만드는 문제였다.
이건 결론적으로 못풀었다.
처음 생각한 풀이과정은
- 순열을 써서 모든 경우의 수를 찾는다
- 각각의 경우를 이어 붙인다 (문자열로 처리하니까)
- 이어 붙인 값들을 정수로 임시 형변환하여 가장 큰 값을 찾은 후 해당 값을 리턴한다.
코드는 다음과 같다.
# 프로그래머스 코딩 테스트 정렬 파트 - 가장 큰 수
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'보다 크다라고 판단하는 것을 확인했는데 그래서 그걸 내림차순으로 정렬하면 어떻게 가장 큰 값이 결과로 나오는건지 잘 이해를 못하겠다.
'wecode > TIL 정리' 카테고리의 다른 글
위코드 사전 스터디 4주차 - 2 (0) | 2020.07.07 |
---|---|
위코드 Pre Course - git (0) | 2020.07.05 |
위코드 사전 스터디 3주차 - 2 (0) | 2020.06.29 |
위코드 사전 스터디 3주차 - 1 (0) | 2020.06.28 |
위코드 사전 스터디 2주차 - 3 (0) | 2020.06.24 |