본문 바로가기
코테연습

182. 삼총사 Javascript

by hxunz 2023. 2. 10.

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

 

프로그래머스

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

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가? 학생들 중 삼총사를 만들 수 있는 방법의 수를 구하라
  • 주어진 자료는 무엇인가? 학생들의 번호를 나타내는 정수 배열
  • 조건은 무엇인가? 서로 다른 학생의 정수 번호가 같을 수 있다.
 

2. 계획

1. 주어진 number를 순회한다.
2. 첫번째 인덱스 + 두번째 인덱스 + 세번째 인덱스 0 아니라면 세번째인덱스+1을하면서 순회하는데 number 끝까지 순회했다면
3. 첫번째 인덱스 + 두번째 인덱스+1 + 다음인덱스가 세번째 인덱스 0 아니라면 세번째 인덱스+1 하면서 순회한다.
4. 2,3 반복하다가 두번째 인덱스가 number배열 마지막에 위치하게 되면 첫번째 인덱스+1 + 그다음인덱스가 두번째인덱스 + 두번째인덱스의 다음인덱스가 세번째인덱스 라고 정한다.
5. 2,3 반복
2,3,4,5 반복하다가 0 나오면 값을 count+1한다.

3. 실행

const solution = (number) => {
  let count = 0;

  for (let i = 0; i < number.length - 2; i++) {
    for (let j = i + 1; j < number.length - 1; j++) {
      for (let k = j + 1; k < number.length; k++) {
        if (number[i] + number[j] + number[k] === 0) {
          count += 1;
        }
      }
    }
  }
  return count;
};

 

4. 반성

  • 조합을 이용해서 풀어보았다.
const solution = (number) => {
  const combinations = getCombinations(number, 3);

  return sum(combinations);
}

// 주어진 배열 number에서 3개의 숫자만을 골라서 새로운 배열로 리턴하는 조합 함수
const getCombinations = (number, fixedNum) => {
  let result = [];

  if (fixedNum === 1) {
    return number.map((it) => [it]);
  }

  number.forEach((fixed, index, origin) => {
    const rest = origin.slice(index + 1);
    const combination = getCombinations(rest, fixedNum - 1);
    const attached = combination.map((it) => [fixed, ...it]);
    
    result.push(...attached);
  })
  return result;
}

// 세개씩 조합된 배열의 숫자들을 더했을 때 결과 값이 0인 개수 구하는 함수
const sum = (combinations) => {
  return combinations.map((it) => it.reduce((acc, cur) => acc + cur), 0).filter((sum) => sum === 0).length;
}

test('solution', () => {
  expect(solution([-2, 3, 0, 2, -5])).toEqual(2);
});

 

댓글