[C++] 문자열 뒤집기 : swap

amudomolla·2023년 5월 28일
0

C++

목록 보기
5/12

참고한 사이트

🤷 양손에 들고 있는 공을 교환해야 하는 상황


양손에 공을 들고 있는 상황에서, 그 공들을 서로 교환하기란 어렵다.


교환하기 위해서는 오른쪽이든 왼쪽이든 둘 중 한 공은 어딘가에 내려 둔 후 공을 반대편으로 옮겨야 한다.

이렇듯 프로그래밍에서도 두 값을 교환할 때, 임시 변수를 만들어 값을 잠시 담아두는 과정을 거치게 된다.

1. 두 수의 교환

#include <iostream>

int main()
{
    int a = 1;
    int b = 2;

    std::cout << "swap 전" << '\n';
    std::cout << "a : " << a << ", "<< "b : " << b << '\n' << '\n';

    int temp = a;  // int temp : 임시 변수
    a = b;
    b = temp;

    std::cout << "swap 후" << '\n';
    std::cout << "a : " << a << ", " << "b : " << b;

    return 0;
}
[결과]
swap 전
a : 1, b : 2

swap 후
a : 2, b : 1

2. 문자열 뒤집기

#include <iostream>

int main()
{
	char arr[8] = "reverse";

	std::cout << "swap 전 : " << arr << '\n';

    return 0;
}
[결과]
swap 전 : reverse
  • arr에 저장된 문자열

int len = 6;  // arr[index] = arr[len] = arr[NULL-1] 
  • NULL을 뺀 index가 0 ~ 6까지이므로 len = 6

🌈 그림으로 swap 원리 이해하기

    char temp;
    
	// swap
    for(int i = 0; i < len; len--, i++) {
        temp = arr[len];
        arr[len] = arr[i];
        arr[i] = temp;
    }
  • i[0~2], len[6~4], 총 3번의 swap을 반복

👩‍💻 최종

#include <iostream>

int main()
{
    char arr[8] = "reverse";

    std::cout << "swap 전 : " << arr << '\n';

    int len = 6;
    char temp;
    
	// swap
    for(int i = 0; i < len; len--, i++) {
        temp = arr[len];
        arr[len] = arr[i];
        arr[i] = temp;
    }
    std::cout << "swap 후 : " << arr << '\n';

    return 0;
}
[결과]
swap 전 : reverse
swap 후 : esrever

3. 포인터로 두 수의 교환

변수의 값만 넘겨줬을 경우

#include <iostream>

void swap(int a, int b) {
	int temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a = 1;
    int b = 2;

    std::cout << "swap 전" << '\n';
    std::cout << "a : " << a << ", "<< "b : " << b << '\n' << '\n';

	swap(a, b);
    
    std::cout << "swap 후" << '\n';
    std::cout << "a : " << a << ", " << "b : " << b;

    return 0;
}
[결과]
swap 전
a : 1, b : 2

swap 후
a : 1, b : 2
  • swap을 했는데, 전과 후의 결과가 똑같은 이유 :
    값만 넘겨줬기 때문

    main() 함수에서의 값이 외부 함수에 영향을 주기 위해서는 값만 넘겨주지 말고, 값의 메모리 주소를 넘겨줘서 외부 함수에서 a, b에 접근할 수 있도록 할 것!

포인터로 넘겨줬을 경우

#include <iostream>

// swap
// 2. int *a = &a, int *b = &b
void swap(int *a, int *b) {
	
    // temp에는 a에 저장된 주소가 가리키는 값이 저장
	int temp = *a; 
    // 그 값에는 다시 b에 저장 주소가 가리키는 값이 저장
    *a = *b;
    *b = temp;
}

int main()
{
    int a = 1;
    int b = 2;

    std::cout << "swap 전" << '\n';
    std::cout << "a : " << a << ", "<< "b : " << b << '\n' << '\n';

	swap(&a, &b);  // 1. a, b의 주소값을 swap() 함수에 전달

    std::cout << "swap 후" << '\n';
    std::cout << "a : " << a << ", " << "b : " << b;

    return 0;
}
[결과]
swap 전
a : 1, b : 2

swap 후
a : 2, b : 1
profile
👩‍💻 기록 및 복습을 위함

0개의 댓글