NIRVANA
[level 1] K번째수 본문
문제
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
- array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
- 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
- 2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
문제 풀이 접근법1
1) len(commands)길이 만큼 반복코드를 반복한다. 이때, commands가 이차원 배열이므로 이중 반복문을 사용해서 commands의 원소에 접근한다.
2) 반복문에서 commands의 각 원소를 담아 놓을 배열 n과 슬라이싱한 배열을 담아 놓을 배열 s를 선언한다.
3) command의 i, j, k를 담아 놓은 배열 n을 사용하여서 i~j번까지 슬라이싱한 array 배열을 배열s에 넣은 뒤 sort()를 사용하여서 정렬한다.
4) array를 조건에 맞게 슬라이싱한 배열 s의 k번째의 원소를 answer에 추가한다.
*해당 문제에서 배열에서 저장하는 원래 인덱싱(0~)이 아니라 1부터 시작했기 때문에 a와 k는 원래 수에서 1씩 빼주었다! b의 경우 어차피 슬라이싱이 -1이므로 하지 않았다.
def solution(array, commands):
answer = []
for i in range(len(commands)):
n = []
s = []
for j in range(len(commands)):
n.append(commands[i][j])
a = n[0] -1
b = n[1]
k = n[2]-1
s = array[a:b]
s.sort()
answer.append(s[k])
return answer
샘플 테스트 케이스는 성공했는데... 런타임에러가 떴다.
이유는 commands의 각 원소의 길이는 3이기 때문이다. 따라서 commands의 각 원소를 따로 저장하는 두번째 반복문에서는 len(commands)가 아니라 걍 3을 해야함!!
문제 풀이 접근법2
두번째 반복문의 길이를 3을 수정하였다.
def solution(array, commands):
answer = []
for i in range(len(commands)):
n = []
s = []
for j in range(3):
n.append(commands[i][j])
a = n[0] -1
b = n[1]
k = n[2]-1
s = array[a:b]
s.sort()
answer.append(s[k])
return answer
다른 분들 풀이
def solution(array, commands):
return list(map(lambda x:sorted(array[x[0]-1:x[1]])[x[2]-1], commands))
람다를 이용해서 푼게 인상 깊었다.
람다...공부해야지 진짜
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
맞다 파이썬은 이렇게 할 수 있었지. 그냥 리스트에서 원소 가져와서 바로 넣을 수 있지!!!
그걸 까먹고 있었네....
for commands in commands:
i, j, k = commands
answer.append(sorted(array[i-1:j])[k-1])
print(answer)
list()는 사용하지 않아도 정답이 된다!(array를 슬라이싱한 것도 어차피 리스트이니까...)
'Coding test(Python3) > Programmers' 카테고리의 다른 글
[level 1] 푸드 파이트 대회 (0) | 2023.07.30 |
---|---|
[level 1]두 개 뽑아서 더하기 (0) | 2023.07.29 |
[level 1] 문자열 내 마음대로 정렬하기 (0) | 2023.07.29 |
[level 1] 숫자 문자열과 영단어(성공...? 다시) (0) | 2023.07.26 |
[level 1] [1차] 비밀지도(비트 연산자로 다시 생각해보기) (0) | 2023.07.25 |