[프로그래머스] 삼총사

재오·2023년 5월 15일
3

코딩테스트

목록 보기
27/46
post-thumbnail

🗒️ 문제

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

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

⚠ 제한사항

  • 3 ≤ number의 길이 ≤ 13
  • -1,000 ≤ number의 각 원소 ≤ 1,000
  • 서로 다른 학생의 정수 번호가 같을 수 있습니다.

📝 문제 해설

삼중 for문과 스택을 이용하면 쉽게 풀리는 문제이다. 삼중 for문을 쓰는 이유는 세개의 값을 더해야하기 때문에 예를 들어 처음으로는 인덱스 0번째 값과 1번째 값을 고정시키고 나머지 하나의 값은 배열을 순회한다. 그리고 점점 배열의 크기를 줄여나가는 방법이다.
혹시 두개의 값을 더한 값과 나머지 값의 절댓값만 같고 부호가 반대라면 스택에 넣어준다. 만약 스택의 길이가 3이면 count +1을 해주고 뒤에 값은 제거하고 또 순회한다. 마찬가지로 다 순회했는데도 만족하는 값이 나오지 않으면 pop을 또 해주는 것을 반복하면 된다.

💡 필요 문법

push()

배열 가장 끝 값에 원소를 넣어준다.

pop()

배열 가장 끝 값을 제거한다.

💻 코드

function solution(number) {
    let stack = [];
    let cnt = 0;
    for(let i=0; i<=number.length - 3; i++){
        stack.push(number[i]);
        for(let j=i+1; j<=number.length -2; j++){
            stack.push(number[j]);
            for(let k=j+1; k<=number.length-1; k++){
                if(number[k] === -1 * (stack[0] + stack[1])){
                    stack.push(number[k]);
                    if(stack.length === 3){
                        cnt++;
                        stack.pop();
                    }
                }
            }
            stack.pop();
        }
        stack.pop();
    }
    return cnt;
}
profile
블로그 이전했습니다

1개의 댓글

comment-user-thumbnail
2023년 5월 21일

3중 for문을 사용했다니.. 이 문제는 브루드포스 유형 문제인가요??

답글 달기