뒤에서 5등 위로
뒤에서 5등 위로
요즘에 프로그래머스 스쿨 코딩테스트 문제를 풀고 있다. 취업이 하고싶어서 연습하는 게 첫번째고 그냥 재밌어서가 두번째다.
레벨 0짜리는 참 쉬운데 레벨 1부터는 내가 못 푸는 문제들이 꽤 많다. 원래 학부 때도 수학적인 사고가 요구되는 알고리즘 문제는 잘 못 풀었었다. 나는 알고리즘을 고안해서 문제를 해결하는 쪽이 아니라, 이미 만들어진 라이브러리를 조합해서 문제를 해결하는 쪽으로 진화해왔다. 쉽게 말해 내가 코덱은 못 만들어도 ffmpeg라이브러리를 사용해 동영상 플레이어는 잘 만든다는 얘기다.
하지만 내가 가보고 싶은 대기업(네카라쿠배?)의 코딩 테스트는 그런 내 사정을 전혀 봐주지 않는 것 같다. 알고리즘을 요구한다. 어쩔 수 없다 내가 맞춰야지.
이제 와서 컴공 1학년 알고리즘 과목을 다시 공부하는 것에 부끄러움은 없지만, 그래도 20년 다돼가는 코딩 경력 어디서도 그 과목이 실전에서 쓰였던 적이 없었다. 내가 고민하는 문제는 이미 누군가가 해결해 놓았고, 나는 그걸 잘 가져다가 쓰기만 하면 되었었다. 앞으로도 이 기조는 변하지 않을 거라고 확신한다. 제 3차 세계대전이라도 터져서 전 세계가 일제히 해저 광케이블을 끊어버리지 않는 한 말이다.
각설하고, 앞으로는 코딩 테스트 중에서 풀이를 특이하게 한 것들을 뽑아서 블로깅할 생각이다. 오늘의 문제는 이거다.
문제
문제설명
정수로 이루어진 리스트 num_list가 주어집니다. num_list에서 가장 작은 5개의 수를 제외한 수들을 오름차순으로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
제한사항
6 ≤ num_list의 길이 ≤ 30
1 ≤ num_list의 원소 ≤ 100
입출력 예
num_list | result |
---|---|
[12, 4, 15, 46, 38, 1, 14, 56, 32, 10] | [15, 32, 38, 46, 56] |
입출력 예 설명
입출력 예 #1
* [12, 4, 15, 46, 38, 1, 14, 56, 32, 10]를 정렬하면 [1, 4, 10, 12, 14, 15, 32, 38, 46, 56]이 되고, 앞에서 부터 6번째 이후의 수들을 고르면 [15, 32, 38, 46, 56]가 됩니다.
풀이
function solution(num_list) {
num_list.sort((a, b) => a - b);
const [, , , , , ...rest] = num_list;
return rest;
}
설명
사실 정석적인 방법은 이렇다.
const rest = num_list.slice(5);
또는 lodash를 사용할 경우
const rest = _.drop(num_list, 5);
실제 현업용 코드라면 이렇게 짰을 것이다. 하지만 이건 코딩 테스트다. 여기선 좀 서커스를 해도 된다. 각설하고, 설명해본다.
딴 건 모르겠고 [,,,,,...rest]
라는 해괴한 코드가 등장한다. 이게 뭘까?
순서대로 보자.
[...rest]
배열 spread 연산자이다. =
뒤에 있는 배열을 전개했다가 rest 라는 변수에 다시 리스트 형식으로 담게 된다.
하지만 우리가 원하는 건 앞자르기이다. 앞에 다섯 개 원소를 버려야 한다. 자, 위의 코드에서 콤마의 갯수를 세어 보자. 그렇다. 정확히 다섯 개이다.
번외: 파이썬
파이썬에서는 _
을 사용해서 빈 자리를 표시한다.
[_,_,_,_,_,*rest] = num_list
*rest
는 Positional arguments 로, 포인터 변수가 아니다! 어쨌든 저게 리스트의 맨 뒤에 붙으면 리스트의 나머지 전부를 저 안에 담는다.
댓글남기기