Code KATA/알고리즘 코드카타

[2024.12.29] 없는 숫자 더하기

iiblueblue 2024. 12. 27. 10:08

문제 설명

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개 변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 1<=numbers의 길이 <=9
    • 0<=numbers의 모든 원소<=9
    • numbers의 모든 원소는 서로 다릅니다.

 

 

입출력 예

numbers result 설명
[1, 2, 3, 4, 6, 7, 8, 0] 14 5, 9가 numbers에 없으므로, 5+9=14를 return 해야 합니다.
[5, 8, 4, 0, 6, 7, 9] 6 1, 2, 3이 numbers에 없으므로 1+2+3=6을 return 해야 합니다.

 

 

문제 풀이

풀이 언어 : C++

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> numbers) {
    int answer = 0;
    
    // 0~9까지 반복문으로 훑기
    for(int i=0; i<10; i++)
    {
        // nubmers 배열에 i가 존재하지 않는다면
        if(find(numbers.begin(), numbers.end(), i)==numbers.end())
        {
            answer+=i; // answer에 i값 더하기
        }
    }
    
    return answer;
}

numbers의 원소는 0~9의 정수이기 때문에 반복문이 0~9까지 돌아갈 수 있게 한다. 반복문 안에서는 if문을 이용해 nubmers안에 i가 있는지 없는지 검사하고 없을 때만 answer에 i를 더하도록 한다. 이 때 numbers 안에 i가 있는지 없는지를 검색할 때는 find()함수를 사용하였다. find 함수를 사용하여 원소를 찾았을 때 결과가 numbers.end()가 나오면 numbers를 끝까지 훑었는데도 수가 존재하지 않았다는 뜻이므로 find 함수를 쓰고 반환값이 numbers.end()일 때만 answer에 i를 더해준다.

 

 

참고사항

find(v.begin(), v.end(), a) 함수는 처음부터 끝까지 벡터 안에 a가 있는지 확인할 수 있는 함수이다. 반환값이 v.end()라면 해당 벡터에 a가 포함되어 있지 않다는 뜻이지만 만약 다른 인덱스 값이 나온다면 a가 numbers안에 존재한다는 뜻이다. 이 함수를 사용하기 위해서는 <algorithm> 헤더파일을 필요로 한다.

#include <algorithm>
...
vector<int> v;

// 0이 v 안에 존재하는지 않으면 출력
if(find(v.begin(), v.end(), 0) == v.end())
{
	cout<<"not exist"<<endl; // 존재하지 않음
}

// 6이 v안에 존재하면 존재하는 인덱스 출력
if(find(v.begin(), v.end(), 6) != v.end())
{
	cout<<find(v.begin(), v.end(), 6)-v.begin()<<endl; // index 확인
}

 

iterator(반복자)는 컨테이너 원소에 접근할 수 있는 포인터와 같은 객체라고 볼 수 있다. vector의 경우 begin(), end() 함수를 이용하여 반복자를 얻을 수 있다.

  • begin() : vector의 첫 번째 원소
  • end() : vector의 마지막 원소 다음 위치

왜 포함되지 않으면 v.end()를 출력하지? 끝값 아닌가? 라고 생각할 수도 있지만 벡터의 end()는 마지막 원소 다음 위치를 가리킨다. 그래서 end()가 마지막 원소를 가리킨다면 원소가 없는 빈 벡터라는 뜻으로 쓰기도 한다.

 

find 함수에서 첫 번재 매개변수 값은 탐색의 영역에 포함되지만 두 번째 맥개변수 값은 탐색의 영역에 포함되지 않는다. 따라서 find(v.begin(), v.end(), 0)은 첫 번째 원소~마지막 원소 까지 살펴본다는 뜻이다. 따라서 마지막 원소 다음 위치인 v.end()가 결과값으로 나온다는 것은 원소가 존재하지 않음을 의미한다.

 

 

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr