programmers.co.kr/learn/courses/30/lessons/68644?language=cpp
코딩테스트 연습 - 두 개 뽑아서 더하기
programmers.co.kr
문제:
주어진 배열에서 두 개씩 뽑아서 더한 값으로 새로운 배열을 만듭니다. 그리고 새로운 배열을 오름차순 정렬 해서 출력하는 문제입니다.
정답으로 출력할 때 중복 값이 없는데, 두 개씩 뽑아서 더했을 때 같은 값이 나올 수 있습니다.
두 개씩 뽑아서 더하는 것은 이중 반복문을 사용했습니다.
그래서 set처럼 중복을 허용하지 않고, 정렬을 만드는 클래스를 생각했습니다. 그런데 찾아보니 set 사용 말고, 알고리즘 헤더에서 기본적으로 제공하는 unique 함수를 벡터에 사용하는 방법도 있었습니다.
그리고 set, map, multiset, multimap은 자동 정렬 해준다고 합니다.
코드:
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> solution(vector<int> numbers) {
vector<int> answer;
for(int i=0; i<numbers.size()-1; i++){
for(int j=i+1; j<numbers.size(); j++){
if(find(answer.begin(),answer.end(),numbers[i]+numbers[j]) == answer.end())
answer.push_back(numbers[i]+numbers[j]);
}
}
sort(answer.begin(),answer.end());
return answer;
}
-----------------------------------------------------------------------------------------------------------------------------------
뭐가 틀렸는지 잘 모르겠습니다. 프로그래머스는 iostream이랑 main이 없어서 제가 작성한 코드로 다시 해보겠습니다.
j랑 i랑 같은 값을 가지면 안 돼서 j는 i+1로 주고, i의 범위는 벡터 크기보다 1만큼 작게 줍니다.
set을 return 해서 main에서 iterator를 받으려고 했는데 오류가 생깁니다. 왜 그런지를 모르겠어서 set 사용을 포기하고 vector로 구현 했습니다. vector는 중복 값이 허용 돼서 걸러내는 것과 정렬하는 코드를 추가 했습니다.
vector에서 해당 값이 존재하는지 찾는 함수로 find 함수를 사용했습니다.
찾으면 해당 주소를 없으면 구간의 끝 값을 리턴합니다.
find(vector.begin(),vector.end(),찾는 값);
혹시 set 잘 사용하시는 분 계시면 도와주세요...
'알고리즘 > 프로그래머스' 카테고리의 다른 글
201002 [월간 코드 챌린지 시즌1] 9월 문제-풍선 터트리기 (0) | 2020.10.11 |
---|---|
201004 완주하지 못한 선수(C++) (0) | 2020.10.10 |
201002 [월간 코드 챌린지 시즌1] 9월 문제-풍선 터트리기 분석 (0) | 2020.09.25 |
200923 [월간 코드 챌린지 시즌1] 9월 문제-삼각 달팽이(C++) - 오류 (0) | 2020.09.22 |