2 분 소요

뒤에서 5등 위로

요즘에 프로그래머스 스쿨 코딩테스트 문제를 풀고 있다. 취업이 하고싶어서 연습하는 게 첫번째고 그냥 재밌어서가 두번째다.

레벨 0짜리는 참 쉬운데 레벨 1부터는 내가 못 푸는 문제들이 꽤 많다. 원래 학부 때도 수학적인 사고가 요구되는 알고리즘 문제는 잘 못 풀었었다. 나는 알고리즘을 고안해서 문제를 해결하는 쪽이 아니라, 이미 만들어진 라이브러리를 조합해서 문제를 해결하는 쪽으로 진화해왔다. 쉽게 말해 내가 코덱은 못 만들어도 ffmpeg라이브러리를 사용해 동영상 플레이어는 잘 만든다는 얘기다.

하지만 내가 가보고 싶은 대기업(네카라쿠배?)의 코딩 테스트는 그런 내 사정을 전혀 봐주지 않는 것 같다. 알고리즘을 요구한다. 어쩔 수 없다 내가 맞춰야지.

이제 와서 컴공 1학년 알고리즘 과목을 다시 공부하는 것에 부끄러움은 없지만, 그래도 20년 다돼가는 코딩 경력 어디서도 그 과목이 실전에서 쓰였던 적이 없었다. 내가 고민하는 문제는 이미 누군가가 해결해 놓았고, 나는 그걸 잘 가져다가 쓰기만 하면 되었었다. 앞으로도 이 기조는 변하지 않을 거라고 확신한다. 제 3차 세계대전이라도 터져서 전 세계가 일제히 해저 광케이블을 끊어버리지 않는 한 말이다.

각설하고, 앞으로는 코딩 테스트 중에서 풀이를 특이하게 한 것들을 뽑아서 블로깅할 생각이다. 오늘의 문제는 이거다.

뒤에서 5등 위로

문제

문제설명

정수로 이루어진 리스트 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 라는 변수에 다시 리스트 형식으로 담게 된다.

전개 구문(MDN) 참고 자료

하지만 우리가 원하는 건 앞자르기이다. 앞에 다섯 개 원소를 버려야 한다. 자, 위의 코드에서 콤마의 갯수를 세어 보자. 그렇다. 정확히 다섯 개이다.

번외: 파이썬

파이썬에서는 _ 을 사용해서 빈 자리를 표시한다.

[_,_,_,_,_,*rest] = num_list

*restPositional arguments 로, 포인터 변수가 아니다! 어쨌든 저게 리스트의 맨 뒤에 붙으면 리스트의 나머지 전부를 저 안에 담는다.

댓글남기기