-
프로그래머스 문제 풀이 K번째 수24년 11월 이전/레거시-프로그래머스-코딩 테스트 고득점 kit 2019. 12. 6. 14:02반응형
문제 URL K번째 수
Contents
- 문제 지문 파악하기
- 구르미의 알고리즘 풀이
문제 지문 파악하기
이번에도, 입력을 통해서 문제를 파악해보도록 하겠습니다. 문제의 입력은 이렇습니다.
입력 :
array = [1, 5, 2, 6, 3, 7, 4]
commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]이제 commands에서 하나씩 꺼내서, 시작점, 끝점, 반환할 인덱스를 가져오겠습니다.
command = [2, 5, 3] //commands[0]
start = 2
end = 5
idx = 3문제에 따르면, 인덱스가 0부터가 아닌 1로 되어 있습니다. 이를 조정해주어야 합니다.
command = [2, 5, 3]
start = 1 //인덱스 조정
end = 5
idx = 2 //인덱스 조정즉, 인덱스가 0부터 시작하도록 start, idx를 1씩 줄여주어야 합니다. end는 안줄여도 됩니다. 왜냐하면, 보통 언어에서 vector, slice등을 잘라낼 때 start <= x < end 의 범위로 잘라내게 됩니다. 계속 진행해보도록 하죠. 이제 start 부터 end까지 array에서 잘라냅니다.
command = [2, 5, 3]
start = 1
end = 5
idx = 2
sub = [5, 2, 6, 3] // array[1:5] (1 <= x <5 범위를 자름)이 sub를 오름차순으로 정렬합니다.
command = [2, 5, 3]
start = 1
end = 5
idx = 2
sub = [2, 3, 5, 6] //오름차순 정렬여기서 idx에 해당하는 5를 answer에 넣어주면 됩니다.
command = [2, 5, 3]
start = 1
end = 5
idx = 2
sub = [2, 3, 5, 6]
answer = [5] //sub[idx]이것을 commands를 모두 순회할 때까지 반복하면 됩니다. 다음은 이후 상황에서 벌어질 데이터들의 상황입니다.
두 번째:
command = [4, 4, 1]
start = 3
end = 4
idx = 0
sub = [6]
answer = [5, 6]
세 번째:
command = [1, 7, 3]
start = 0
end = 7
idx = 2
sub = [1, 2, 3, 4, 5, 6, 7]
answer = [5, 6, 3]이렇게 해서 만들어진 answer를 반환하면 됩니다. 이 문제에서 따로, 우리가 프로그래밍적으로 생각할 필요는 없습니다. 그냥 풀면 되지요.
구르미의 알고리즘 풀이
"문제 지문 파악하기"를 토대로 세운 알고리즘을 순서대로 나열하면 다음과 같습니다.
- commands를 다음과 같이 순회합니다.
- command에서 첫 원소(sub 배열의 시작점)를 start, 두 번째 원소(sub 배열의 끝점)를 end, 세번째 원소(sub 배열의 반환 원소의 위치)를 idx를 꺼내옵니다.
- array에서 start-1 부터 end까지 잘라서 배열 sub를 만듭니다.
- sub를 정렬합니다.
- sub[idx-1]에 해당하는 원소를 answer에 넣습니다.
- 이렇게 초기화된 answer를 반환합니다.
이를 코드로 표현하면 다음과 같습니다. 다음은 PYTHON 코드입니다.
PYTHON 코드
def solution(array, commands): answer = [] # 1. commands를 순회합니다. for command in commands: # 1. start, end, idx를 command 에서 꺼내옵니다. (start, end, idx) = command # 2. array에서 start-1 ~ end 까지 잘라 배열 sub를 만듭니다. 이 sub를 정렬합니다. sub = sorted(array[start-1:end]) # 3. sub[idx-1]을 answer에 반환합니다. answer.append(sub[idx-1]) return answer
이번엔 CPP 코드입니다. 알고리즘은 동일하고, 언어만 바뀐 것입니다.
CPP 코드
#include <string> #include <vector> #include <algorithm> using namespace std; vector<int> solution(vector<int> array, vector<vector<int>> commands) { vector<int> answer; for (const auto & command : commands) { auto start = command[0]; auto end = command[1]; auto idx = command[2]; auto sub = vector<int>(array.begin() + start - 1, array.begin() + end); sort(sub.begin(), sub.end()); answer.push_back(sub[idx - 1]); } return answer; }
참고적으로 파이썬의 "리스트 컴프리헨션"을 이용하면, 한 줄로 풀 수도 있습니다. 다음은 한 줄로 파이썬 코드입니다.
PYTHON 코드
def solution(array, commands): answer = [ sorted(array[start-1:end])[idx-1] for (start, end, idx) in commands ] return answer
728x90'레거시 > 레거시-프로그래머스-코딩 테스트 고득점 kit' 카테고리의 다른 글
프로그래머스 문제 풀이 모의고사 (0) 2019.12.09 프로그래머스 문제 풀이 H-Index (0) 2019.12.07 프로그래머스 문제 풀이 이중 우선순위 큐 (1) 2019.12.05 프로그래머스 문제 풀이 디스크 컨트롤러 (3) 2019.12.04 프로그래머스 문제 풀이 라면 공장 (0) 2019.12.02