[프로그래머스]Lv.1 삼총사 -c++

potatoj11n·2024년 1월 10일

프로그래머스

목록 보기
9/25
post-thumbnail

🌱문제 설명

[프로그래머스]Lv.1 삼총사

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

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


제한사항

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

입출력 예

numberresult
[-2, 3, 0, 2, -5]2
[-3, -2, -1, 0, 1, 2, 3]5
[-1, 1, -1, 1]0

입출력 예 #2

  • 학생들의 정수 번호 쌍 (-3, 0, 3), (-2, 0, 2), (-1, 0, 1), (-2, -1, 3), (-3, 1, 2) 이 삼총사가 될 수 있으므로, 5를 return 합니다.

입출력 예 #3

  • 삼총사가 될 수 있는 방법이 없습니다.

풀이

#include <string>
#include <vector>
#include<iostream>

using namespace std;

int solution(vector<int> number) {//vector 클래스를 사용해 배열 생성
    int answer = 0;//합이 0인 조합의 수를 저장할 변수
    for( int i =0; i< number.size()-2;i++)// 첫번째 학생을 뽑는 반복문
        for( int j =i+1;j<number.size()-1;j++)//두번째 학생을 뽑는 반복문
            for( int k = j+1; k<number.size();k++)//세번째 학생을 뽑는 반복문
            {
                if(number[i]+number[j]+number[k] == 0)//배열에서 골라낸 세 원소의 합이 0이면
                    answer++;//조합의 수를 늘린다.
            }
    if(answer == 0)// 세 원소의 합이 0인 조합이 없다면
        cout <<"삼총사가 될 수 있는 방법이 없습니다."<<endl;
    
    return answer;
}

코드 설명

이 문제는 주어진 배열에서 세 개를 골라 합이 0인 조합의 수를 찾아내는 문제이다. 배열에서 항목을 고른다 라는 점에서 반복문을 사용했다. 문제에서 3개의 원소를 골라 그 합이 0인 조합을 찾으라했으니 삼중 반복문을 사용해 뽑아낸 인덱스들끼리 더해서 합을 확인하면 문제를 쉽게 해결할 수 있다.

  • int solution(vector<int> number) : vector 클래스를 사용해 number 배열을 만든다.
  • int answer = 0; : 합이 0이 되는 조합의 수를 저장할 변수 생성
  • for( int i =0; i< number.size()-2;i++) : 첫번째 학생을 고르는 i 인덱스를 사용한 반복문 ⚠️ 총 3명의 학생을 뽑는 삼중 반복문을 사용하기 때문에 안쪽 반복문에서 중복되는 학생이 없도록 반복문의 범위를 앞으로 뽑게 될 두 명의 학생이 빠진 number.size()-2 로 설정한다.
  • for( int j =i+1;j<number.size()-1;j++) : 두번째 학생을 고르는 j 인덱스를 사용한 반복문 ⚠️ 바깥 반복문 i 인덱스를 사용한 바깥 반복문에서 첫번째 학생을 골랐으니까 i에 1이 더해진 위치에서 시작하고 반복문의 범위도 앞으로 뽑을 한명의 학생이 빠진 number.size()-1 로 설정한다.
  • for( int k = j+1; k<number.size();k++): 세번째 학생을 고르는 k 인덱스를 사용한 반복문 앞에서 두명의 학생을 이미 뽑았으니까 j에서 1이 더해진 위치에서 시작한다.
  • if(number[i]+number[j]+number[k] == 0) : 뽑은 세 개의 합이 0이면 answer 증가

🔥어려웠던 점


오늘 문제는 수월하게 해결했다. 처음에 삼중 반복문에서 배열의 크기를 안쪽 반복문으로 들어갈수록 작도록 k 반복문의 범위를 number.size()-2 로 설정해서 오류가 있었다. 그러나 잘 생각해보면 i인덱스의 바깥 반복문의 크기가 가장 크게 되면 같은 학생이 여러번 선택될 가능성이 있어서 결과가 정확하게 나오지 않을 수 있다. 따라서 i < j < k 조건을 만족하는 인덱스 조합을 생성하기 위해서는 배열의 크기가 바깥 반복문으로 갈수록 작아야한다.

0개의 댓글