프로그래머스에 올라와 있는 코딩테스트를 진행하면서 공부한 내용 및 막혔던 부분들에 대해 리뷰하고자 합니다.
이 글은 python을 통한 힙에 대해 리뷰하고 다른 것들을 참고하시려면 아래 링크를 참고해주세요.
overview
정렬
list.sort()
는 내림차순으로 정렬하고, list.sort(reverse=True)
는 오름차순으로 정렬하는 것이다. list.sort(key=len)
으로 하면, 길이를 기준으로 정렬할 수 있다.
list.reverse()
를 사용하게 되면 전체 list를 뒤집는다.
위의 코드들은 출력만 한다. 결과를 반환하고자 한다면, sorted와 reversed를 사용해야 한다.
1
2
3
4
5
6
7
8
9
10
>>> x = [1 ,11, 2, 3]
>>> s = sorted(x)
>>> s
[1, 2, 3, 11]
>>> r = reversed(x)
>>> y
<list_reverseiterator object at 0x1060c9fd0>
>>> list(y)
[3, 2, 11, 1]
reversed를 하면 확인을 위해서 list로 한번 더 변형을 해야 한다.
Index
- k번째수
- 가장 큰 수
- H-Index
K번째 수
나의 전체 코드
1
2
3
4
5
6
7
8
9
10
11
def solution(array, commands):
answer = []
for i in commands:
start = i[0]; end = i[1]
arr = array[start-1:end]
arr = sorted(arr)
answer.append(arr[i[2]-1])
#print("start: {}\t end: {}\t arr: {}\t answer: {}".format(start,end,arr,answer))
return answer
1
2
3
4
5
입력값 〉 [1, 5, 2, 6, 3, 7, 4], [[2, 5, 3], [4, 4, 1], [1, 7, 3]]
출력 〉
start: 2 end: 5 arr: [2, 3, 5, 6] answer: [5]
start: 4 end: 4 arr: [6] answer: [5, 6]
start: 1 end: 7 arr: [1, 2, 3, 4, 5, 6, 7] answer: [5, 6, 3]
가장 큰 수
참조한 코드
1
2
3
4
5
6
7
def solution(numbers):
answer = ''
numbers = list(map(str,numbers))
numbers.sort(key= lambda x:x*4, reverse=True)
return str(int(''.join(numbers)))
나의 경우 for문을 중복해서 사용했다. 이는 시간 초과를 야기했고, 26점을 받았다. 그래서 다른 사람의 풀이를 보았는데, map이라는 함수와 key를 적절히 사용한 것을 보았다. 생각치도 못했다. 계속 x*4를 만들어주고, 그를 통해 정렬한 후 원래 숫자에 해당하는 길이만큼 잘라주었는데, 반례가 너무 많았다.
map
map은 리스트의 요소를 지정된 함수로 처리해주는 함수다. 원본 리스트를 변경하지 않고 새 리스트를 생성하게 된다.
- list(map(함수,리스트))
- tuple(map(함수,튜플))
1
2
3
4
>>> a = [1.2, 2.5, 3.7, 4.6]
>>> a = list(map(int, a))
>>> a
[1, 2, 3, 4]
매번 for문을 반복하면서 요소를 변경하지 않아도 되는 편한 함수다.
H-index
나의 전체 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def solution(citations):
answer = 0
maxs = 0
citations.sort()
for h in range(max(citations)+1):
up = [h <= i for i in citations]
count = up.count(True)
if h <= count: maxs = h
else: return h
print(h,up,count,maxs)
return maxs
1
2
3
4
5
6
7
8
9
10
11
12
13
입력값 〉 [10, 8, 5, 4, 3]
출력 〉
0 [True, True, True, True, True] 5 0
1 [True, True, True, True, True] 5 1
2 [True, True, True, True, True] 5 2
3 [True, True, True, True, True] 5 3
4 [False, True, True, True, True] 4 4
5 [False, False, True, True, True] 3 4
6 [False, False, False, True, True] 2 4
7 [False, False, False, True, True] 2 4
8 [False, False, False, True, True] 2 4
9 [False, False, False, False, True] 1 4
10 [False, False, False, False, True] 1 4
문제를 이해하기만 하면 풀기 쉬운 문제다.