개발/알고리즘(코딩테스트)

프로그래머스, 자바스크립트) 전국 대회 선발 고사

빔네모 2024. 3. 8. 11:59

문제

https://school.programmers.co.kr/learn/courses/30/lessons/181851

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

일단..문제를 보고 든 생각, 배열에서 true만 뽑아 랭크 : 번호 로 할당된 객체를 만든다.

객체는 key가 숫자일 경우 자동적으로 오름차순 정렬되기 때매 랭크 순서대로 정렬된 값을 구할 수 있다.

다음 Object.values 를 통해 배열로 변경해 순서대로 3개를 꺼낸다

 

(무조건 3개 이상의 값을 가진다는 조건이 있으니 등수가 모자랄 경우는 고려하지 않음)

function solution(rank, attendance) {
  //배열 합쳐서 객체 만들기
  const obj = rank.reduce((acc, cur, i) => {
    if (attendance[i]) {
      //true인 경우만 랭크 : 번호 로 넣기
      acc[cur] = i;
    }
    return acc;
  }, {});
  //객체 속성에서 숫자 키는 자동적으로 오름차순 정렬됨
  const [a, b, c, ...rest] = Object.values(obj);
  //10000 × a + 100 × b + c
  return a * 10000 + b * 100 + c;
}

 

다른 풀이

 

배열을 돌며 rank와 인덱스를 합쳐 [rank, index] 형식으로 만들어준다.

여기서 ture인 애들만 필터를 통해 걸러내고 오름차순 정렬한다.

그러면 a,b,c에는 [rank, index] 형태로 상위 3개의 배열이 담겨있게 된다.

 

최종적으로 a[1] 같이 인덱스 번호를 가져와 연산을 수행한다.

function solution(rank, attendance) {
  const [a, b, c] = rank
    .map((r, i) => [r, i])
    .filter(([_, i]) => attendance[i])
    .sort(([a], [b]) => a - b);
  return 10000 * a[1] + 100 * b[1] + c[1];
}