[C++] 백준 10813번 문제 : 공 바꾸기 - 배열의 swap()

wansuper·2023년 10월 19일
0

CodingTest

목록 보기
8/34

핵심 키워드 : swap(), 배열의 원소 저장 방식

오답코드

#include <iostream>

using namespace std;

int main()
{
    // range = 공의 번호, num = 공을 바꿀 횟수
    int range, num;
    cin >> range >> num;
    
    // 첫번째 배열 저장
    int arr[range] = { 0 };
    for (int i = 0; i < range; i++) {
        arr[i] = i + 1;
    }
    // 바꾸게 될 인덱스 배열 저장
    for (int i = 1; i <= num; i++) {
        int a, b;
        cin >> a >> b;
        swap(arr[a], arr[b]);
    }
    // 배열 원소대로 인덱스에 따라 교환
    int t, w, new, new2;
    for (int i = 0; i < num; i++) {
        for (int k = 0; k < range; k++) {
            if (ch[i][0] == arr[k]) {
                t = ch[i][0];
            }
            if (ch[i][1] == arr[k]) {
                w = ch[i][1];
            }
        }
        for (int j = 0; j < range; j++) {
            if (arr[j] == t) {
                new1 = arr[j];
                for (int k = 0; k < range; k++) {
                    if (arr[k] == w) {
                        new2 = arr[k];
                        arr[j] = new2;
                    }
                }
            } 
        }
    }
     
    return 0;
}

오답코드 리뷰

그렇다.. 심지어 미완성 코드다. 원래 내가 접근하려던 방식은 다음과 같다.

공이 몇 번까지 있는지에 대한 번호를 range로 받아서 arr[range] 배열로써 원소와 함께 저장하고, 바꿀 횟수 num을 행의 개수로 가지며 열은 2개로 고정인 2차원 배열을 생성하여 사용자 입력을 받아 저장한다.
그리고, 생성한 2개의 배열을 for문으로 돌려서 바꿀 인덱스가 들어있는 2차원 배열의 값이 처음 생성한 배열의 값과 같으면, 새로운 int형 변수 t와 w에 각각 저장한다.
그리고는 또 for문을 돌려서 arr[range]의 값이 t 혹은 w와 같다면, new1, new2라는 새로운 변수에 각각 저장한다. 그 이후, new1, new2를 이용하여 arr[] 배열의 값을 교환하는데 이용하는 방식으로 매우 난잡하게 구성했다.

가장 처음에는 2차원 배열을 만드는 것까지 큰 무리가 없었으나, 교환 이라는 것을 배열로 이뤄내기에 다루기가 힘들어 int형 변수를 많이 만들어냈다. 또한, 각종 라이브러리를 이용하거나 내장 함수에 대해 지식의 깊이가 좁아 반복적인 for, if문으로 돌파구를 떠올리려 했는데 쉽지 않았다.

1시간 넘는 시간동안 끙끙 앓다가 GPT 선생님께서 다음 정답 코드를 일러주셨다. 원래는 아이디어를 보고 내가 구현하는 방향으로 하려 했으나, 오답코드에 비해 간단한 G선생님의 코드를 보고 현타가 와서 우선은 그대로 받아적어 두었다.

정답코드

#include <iostream>
using namespace std;

int main() {
	// 공의 개수 n과 바꿀 횟수 m을 입력
    int n, m;
    cin >> n >> m;
    
    // (*): 배열의 크기가 101인 balls[]를 선언하고, i번째 위치에 i를 저장한다.
    int balls[101];
    for (int i = 1; i <= n; i++) {
        balls[i] = i;
    }
	
    // (**): 0부터 바꿀 횟수만큼 반복하도록 함
    for (int i = 0; i < m; i++) {
    	
        // 교환하고 싶은 index 2개 입력
        int a, b;
        cin >> a >> b;
        swap(balls[a], balls[b]);
    }
	
    // 만들어진 배열 출력
    for (int i = 1; i <= n; i++) {
        cout << balls[i] << " ";
    }

    return 0;
}

정답코드 리뷰

(*): 여기서 특이하다고 생각한 점은 일반적으로 고려하는 배열의 0번째를 무시하고 1번째에 1을, 2번째에 2를, ... 저장하는 방식을 택했다는 점이다. 또, 공의 개수를 정확히 맞춘 배열의 크기가 아닌 여러 테스트 케이스를 고려하여 크기가 굉장히 큰 배열을 처음부터 선언했다는 점이다.

(**): 이 부분에서는 i를 이용하여 for문을 돌렸지만 내부에서 쓰이지는 않았다. 즉, i를 쓰지 않더라도 어쨌거나 m회 반복할테니까 이에 따라 알아서 반복하도록 두고, 내부에 코드를 작성했다.

swap(balls[a], balls[b]): balls[]에는 어차피 i번째 index에 i가 정직하게 들어가 있으므로, 더 다루기 편하다. 이 부분을 간과해서 배열을 int 변수로 돌리려 더 먼 길을 돌아갔다는 점에서 내 자신이 아쉬웠다. 아무튼, swap 함수를 이용하여 배열의 값을 더욱 쉽게 교환할 수 있도록 사용했다.

profile
🚗 Autonomous Vehicle 🖥️ Study Alone

0개의 댓글