pair 타입의 + 연산자 오버로딩을 어떻게 해야 하나요

백준 1003번 링크
피보나치에서 0과 1이 입력된 횟수를 구하는 함수인데
0인 부분과 1인 부분을 피보나치 함수로 구현 했는데
pair 자료형을 return할 때 문제가 생겨서 연산자 오버로딩으로 해결해보려 했는데
잘 안되서 질문 올려봐요.
굳이 pair 안써도 풀긴 하는데 pair로 풀어보고 싶어서 질문 올렸습니다.

#include <iostream>
#include <vector>
#include <utility>

std::pair<int, int> operator + (std::pair<int,int> &first,std::pair<int, int> & second){
	int x = first.first + first.second;
	int y = second.first + second.second;	
	return std::make_pair(x, y);
}

std::pair<int, int> pairnacci(std::vector<std::pair<int, int>> &zeroOne, int n){
	if(n == 0)
		return std::make_pair(1,0);
	else if (n == 1)
		return std::make_pair(0,1);
	else if(!zeroOne[n].first){
		return std::make_pair(zeroOne[n].first , zeroOne[n].second);
	} else {
		return zeroOne[n] = pairnacci(zeroOne, n-1) + pairnacci(zeroOne, n-2);
	}
		
}
int main() {
	std::vector<std::pair<int, int>> zeroOne;	
//	printf("%d\n",zeroOne.size());
	int coin =0;
	std::cin >> coin;
	zeroOne.push_back( std::make_pair(1, 0) );	//0일떄
	zeroOne.push_back( std::make_pair(0, 1) );	//1일때 
//	zeroOne.resize(coin);
			//2일때는 얘내 둘을 더하는거지 
	for(int i=0;i<coin; ++i){
		int f;
		std::cin >> f;
		zeroOne[f] = pairnacci(zeroOne,f);
		
	}
		for(std::pair<int, int> i : zeroOne){
			std::cout<< i.first <<" "<< i.second << "\n";
		}
    return 0;
}

제가 예전에 받은 답변이 답이 될 수 있을 것 같읍니다

pairnacci(zeroOne, n-1) + pairnacci(zeroOne, n-2);
std::pair<int, int> operator + (std::pair<int,int> &first,std::pair<int, int> & second)

이 부분들이 문제가 되는 것 같은데요
함수 호출의 결과는 rvalue이기 때문에, operator+가 non-const lvalue reference로 pairnacci의 결과 값을 받을 수 없읍니다

문제없이 컴파일하기 위해서는 const를 붙이든지, reference가 아니라 값을 인자로 취해야 할 듯 싶습니다

std::pair<int, int> operator + (const std::pair<int,int> &first, const std::pair<int, int> & second)

또는

std::pair<int, int> operator + (std::pair<int,int> first,std::pair<int, int> second)

로 수정하면 우선 오류는 발생하지 않습니다

더 좋게 구현하는 방법은 고수분들에게 맡기겠읍니다… :hugs:

1 Like

const로 바꿔봤는데
출력이
1 0
0 1
에서 멈추는 걸로 보아 함수에서 계산된 값들이 전달이 안되는거같네요
상상도 못한 문제…!

요즘 귀차니즘이 넘쳐흘러서 대충 읽은거라 민폐일수 있지만,

	if(n == 0)
		return std::make_pair(1,0);
	else if (n == 1)
		return std::make_pair(0,1);

이렇게 하신걸 보면 pair 의 왼쪽 값이 0의 참조 누적이고, 오른쪽 값이 1의 참조 누적으로 쓰려는 용도신것 같은데…

std::pair<int, int> operator + (std::pair<int,int> &first,std::pair<int, int> & second){
	int x = first.first + first.second;
	int y = second.first + second.second;	
	return std::make_pair(x, y);
}

first 는 first 끼리 second 는 second 끼리 더해야하는 것 아닌가용?

1 Like

대충 이렇게 동작하면 되는거 아닌가요?

using   bitrefs = std::pair<int,int>;

bitrefs operator+( bitrefs& l, bitrefs& r )
{
	return  bitrefs( l.first + r.first, l.second + r.second );
}

int main()
{
	bitrefs a{ 1, 2 }, b{ 3, 4 };
	auto    c = a + b;
	std::cout << c.first << " " << c.second << std::endl;
	return  0;
}

4 6

2 Likes