배열값 한 칸씩 옮기기
오늘은 배열값을 한칸씩 옮길 때 유의할 점을 따져 보려고 한다.
예를 들자면, [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]으로 덮어 씌워진다. 이 경우 뒤에서 끌어주는 것이기 때문에 매핑한 값을 전달하는 일은 벌어지지 않는다.
기본적으로 원본에 매핑할 때는 어떤 플로우를 가지는 지 생각 해 볼 필요가 있다.
'C C++ > C C++ 유용한 알고리즘 기법' 카테고리의 다른 글
[C/C++] 연속된 숫자 한자리씩 나누어 입력 받기 (0) | 2023.03.16 |
---|---|
알고리즘 병합 정렬 완벽 이해하기 (0) | 2022.10.29 |
[C/C++] 2차원 배열 90도 회전하기 (0) | 2022.10.08 |
[C/C++] 백준 11653번 소인수분해 (0) | 2022.10.04 |
[C/C++] 팩토리얼 구현하기 (재귀함수의 이해) (0) | 2022.09.29 |
댓글