정렬

K번째수

1차 답안

1
2
3
4
5
6
7
8
9
10
11
def solution(array, commands):
answer = []
tmp = []
for command in commands:
tmp = array[command[0]-1:command[1]]
tmp.sort()
# 정렬된 배열에서 answer 삽입
answer.append(tmp[command[2]-1])

return answer

다른사람 답안 1

1
2
3
4
5
6
def solution(array, commands):
answer = []
for command in commands:
i,j,k = command
answer.append(list(sorted(array[i-1:j]))[k-1])
return answer

i,j,k = command
원소를 3가지 변수로 저장한다는 아이디어 생각하기

다른사람 답안 2

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

map(적용시킬함수, 적용할 요소)

1
2
3
4
5
6
7
8
9
10
11
12
def add_1(n):
return n + 1

target = [1, 2, 3, 4, 5]
result = map(add_1, target)
print(result)
# [2,3,4,5,6]

# use lamda
result = map(lambda x : x+1, target)
print(result)
# [2,3,4,5,6]

filter(적용시킬 함수, 적용할 요소들)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
target = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def is_even(n):
return True if n % 2 == 0 else False

result = filter(is_even, target)
print(list(result))
# [2, 4, 6, 8, 10]

# use lamda
result = filter(lambda x : x%2==0, target)
print(list(result))
# [2, 4, 6, 8, 10]

람다 공부는 꼭해야할 것 같다.

가장 큰 수

1차 답안

1
2
3
4
5
6
7
def solution(numbers):
answer = ''

number_str = list(map(lambda x : str(x), numbers))
number_str.sort(reverse = True)
answer = answer.join(number_str)
return answer

6 / 60을 비교했을 때 60이 상위에 리스트되어 최대값이 출력되지 않습니다.

2차답안

1
2
3
4
5
6
7
8
def solution(numbers):
answer = ''

numbers = list(map(str, numbers))
numbers.sort(key = lambda x: x*3, reverse = True)
answer = answer.join(numbers)

return answer

numbers.sort(key = lambda x: x*3, reverse = True)

핵심적인 것은 list는 str이기 때문에 1000이하의 수를 비교하기 위해서는 x3을 해 해당 문자열을 비교하면 된다는 점이 였다.

lambda를 이용해 x*3을 sort()의 키로 잡아 배열을 하게 된다며 문제가 해결 된다.

테스트 11 통과 실패

3차 답안

1
2
3
4
5
6
7
8
def solution(numbers):
answer = ''

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

return answer

answer = str(int(answer.join(numbers)))

테스트 11 통과 실패는 [0,0,0,0,0,0] 이렇게 있을 때 “0” 하나만 나와야 하는 케이스였습니다.

그렇기 때문에 join할때 int 타입으로 변환 후 join을 해줘야 해당 케이스에 통과할 수 있습니다.

다른사람 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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):
numbers = [str(x) for x in numbers]
numbers = sorted(numbers, key=functools.cmp_to_key(comparator),reverse=True)
answer = str(int(''.join(numbers)))
return answer

# use lambda
# numbers = sorted(numbers, key = cmp_to_key(lambda x,y:int(x+y)-int(y+x)), reverse = True)

sorted()의 시간복잡도는 n * logn 이다

functools.cmp_to_key()

0 , 1 ,-1 3가지로 비교하는 비교문 0일경우 유지 1일경우 왼쪽요소가 앞으로 -1일경우 오른쪽요소가 앞으로 가도록 지정한다.

ex) 330, 303 비교시
(330> 303 #1) -(330<303 #0) -> 값은 1이므로 [3,30]으로 배열된다.

H-Index

1차 답안

문제가 너무어려워 이해하는데 시간이 오래걸렸다
중요한 점은 h회 이상 인용된 논문의 개수가 h개이상 이점을 코드로 구현하는 점이였다.

1
2
3
4
5
6
7
8
9
10
11
12
def solution(citations):

citations.sort(reverse=True)

for i,j in enumerate(citations,1):
if i <= j:
max = i

if max > len(citations):
return len(citations)
else:
return max
  1. 먼저 citations 배열을 역순으로 한 뒤 enumerate를 통해 해당 원소보다 몇개 이상인 논문의 수를 구한다. (최대 H-Index를 구해야 하기 때문에)
  2. citations = [22,24]인 경우 해당 H-index의 값은 배열의 개수인 2가 되므로 해당 케이스를 수정한다.
  3. Case16번 통과실패 -> 모든 원소가 0 인경우

2차 답안

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

def solution(citations):

# 모든 원소가 0일 경우
if sum(citations) == 0:
return 0

citations.sort(reverse=True)

for i,j in enumerate(citations,1):
if i <= j:
max = i

if max > len(citations):
return len(citations)
else:
return max

다른사람풀이

1
2
3
4
def solution(citations):
citations.sort(reverse=True)
answer = max(map(min, enumerate(citations, start=1)))
return answer

enumerate 된 배열을 통해 두 요소중 작은 것을 가져오는 코드 풀이가 인상적이 였다.
내가 짠 코드와 비슷한 로직으로 구현했지만 훨씬 간편한 코드인 것 같다.