본문 바로가기
C C++/C C++ 유용한 알고리즘 기법

[C/C++] 배열값 옮기기

by Go! Jake 2022. 10. 15.

배열값 한 칸씩 옮기기

오늘은 배열값을 한칸씩 옮길 때 유의할 점을 따져 보려고 한다.

예를 들자면, [1,2,3] 값을 [3,1,2] 등으로 옮겨본다고 하자.

쉽다고 생각할만 하지만 유의할 점이 하나 있다.

<잘못된 예>

#include <iostream>
#include <vector>
#define endl "\n"
using namespace std;
			
int arr[]={1,2,3};

void print()
{
	for (int i=0; i<3; i++)
	{
		cout<<arr[i]<<" ";
	}
}
		
int main() {
	
	int tmp=arr[2];
	for (int i=1; i<3; i++)
	{
		arr[i]=arr[i-1];
	}
	arr[0]=tmp;
	print();	
	
    return 0;
}

위에 코드만 보면 단순히 arr[1]=arr[0], arr[2]=arr[1]로 한칸씩 옮겨준 게 됨.

그리고 덮어 쓰기되는 2번 인덱스는 미리 tmp로 빼 두었다가 0번 인덱스가 넣어줌.

 

위에 print()를 통해 출력을 해 보자.

놀랍게도, 3 1 1 이라는 결과값이 나오게 된다. 왜 이럴까?

바로, arr[1]=arr[0], arr[2]=arr[1] 를 보면, arr[0]이 arr[1]에 매핑되고 arr[1]이 arr[2]에 매핑되면서 결과적으로 arr[0] 값이 arr[2]에 매핑된 것이다!

 

따라서 이를 피하기 위해서는 아래와 같이 할 필요가 있다.

 

<올바른 예>

#include <iostream>
#include <vector>
#define endl "\n"
using namespace std;
			
int arr[]={1,2,3};

void print()
{
	for (int i=0; i<3; i++)
	{
		cout<<arr[i]<<" ";
	}
}
		
int main() {
	
	int tmp=arr[2];
	for (int i=3; i>=1; i--)
	{
		arr[i]=arr[i-1];
	}
	arr[0]=tmp;
	print();	
	
    return 0;
}

바로 for문을 i=3부터 i=1까지 내려가면서 덮어 쓴 것이다.

arr[3]=arr[2]; arr[2]=arr[1]; 그리고 arr[1]=arr[0]으로 덮어 씌워진다. 이 경우 뒤에서 끌어주는 것이기 때문에 매핑한 값을 전달하는 일은 벌어지지 않는다.

 

기본적으로 원본에 매핑할 때는 어떤 플로우를 가지는 지 생각 해 볼 필요가 있다.

댓글