[PS] Programmers/코딩테스트 연습/연습문제/삼총사

2024. 2. 21. 22:27✨ PS(ProblemSolving)

문제 설명

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.


해결 전략

  1. 주어진 number를 3개씩 잘라서 threeNums라는 배열에 담는 함수 sliceNums 생성
  2. threeNums에 담긴 요소들을 꺼내어 합이 0일 경우 answer에 1을 더함

작성 코드

function solution(number) {
    var answer = 0;

    const sliceNums = () => {

        let threeNums = [];

        for (i = 0; i < number.length - 2; i++) {
        threeNums.push(number.slice(i, i+2))
    }    
        return threeNums
    }

    const threeNums = sliceNums();

    threeNums.forEach(num => {
        let sum = 0;
        for(i = 0; i < 3; i++) {
            sum = sum + num[i]
        }
        sum === 0 ? answer++ : answer
    })
    return answer;
}

오류 수정

  1. slice범위를(i,i+3)으로 수정
  2. threeNums가 모든 case를 포함하지 못하고있음
  3. 재귀함수를 사용하여 모든 case를 포함하도록 하고, 길이가 3이면서 요소의 합이 0일 때 answer에 1을 더하는 로직으로 변경

완성 코드

function solution(numbers) {
    let answer = 0;
    const n = numbers.length;

    const findCombination = (start, sum, selected) => {
        if (selected.length === 3) {
            if (sum === 0) {
                answer++
            }
            return
        }
        for (i = start; i < n; i++) {
            findCombination(i + 1, sum + numbers[i], [...selected, numbers[i]]);
        }
    }
    findCombination(0, 0, [])

    return answer
}