공 바꾸기

표준성·2023년 3월 19일
0

baekjoon

목록 보기
1/5

백준 10813

문제 링크


문제


문제 이해

  • 바구니의 개수 : N / 공을 바꾸는 횟수 : M
(1 ≤ N ≤ 100, 1 ≤ M ≤ 100)

  • 1번 바구니부터 N번 바구니까지는 각각 번호에 해당하는 공이 들어있다.
(EX : 1번 바구니 : 1번 공, 2번 바구니 : 2번 공, ... N번 바구니 : N번 공)

  • I번 바구니와 J번 바구니의 공을 바꾼다.
(EX : I = 1 / J = 3라면 1번 바구니에는 3번 공을, 3번 바구니에는 1번 공을 넣는다.)
(1 ≤ i ≤ j ≤ N)

💡문제 해결 과정

첫 번째로 각 바구니에 바구니의 번호와 대응하는 공을 넣어줘야 한다. 이때 바구니의 최대 범위는 N까지이다.

for (int i = 1; i <= n; i++) {
    arr[i] = i;
  }

이후 M번 동안 I와 J의 입력을 받은 후, J번째 공과 I번째 공을 스왑하면 된다.

int i, j;

  for (int a = 1; a <= m; a++) {
    scanf("%d %d", &i, &j);
    swap(&arr[i], &arr[j]);
  }

여기서 중요한 것은 C언어에선 SWAP 함수가 내장되어 있지 않다. 따라서 SWAP 함수를 직접 구현해야한다. 처음 내가 시도한 SWAP 함수는 다음과 같았다.

void swap(int x, int y) {
  int temp = x;
  x = y;
  y = temp;
}

그러나 다음과 같은 함수를 사용했을 때 값이 바뀌어 나오지 않고 그대로 출력되었다. 이유를 찾아보니 함수 내에서 바뀐 값은 함수 밖에서 적용이 되지 않는다는 사실을 깨달았다. 이를 해결하기 위해서는 변수의 메모리 주소를 찾는 포인터 변수가 필요했다.

void swap(int* x, int* y) {
  int temp = *x;
  *x = *y;
  *y = temp;
}

x와 y를 포인터 인자로 받은 후, 임시 그릇인 temp에 x를 담는다. 이후 x와 y의 포인터 값을 바꾸고, 다시 y에서 temp(x의 값)을 넣어주면 x와 y의 포인터 값이 바뀌게 된다.

마지막으로 출력해주면 코드가 완성된다.

for (int a = 1; a <= n; a++) {
    printf("%d ", arr[a]);
  }

코드

#include <stdio.h>

void swap(int* x, int* y) {
  int temp = *x;
  *x = *y;
  *y = temp;
}

int main(void) {
  int n, m, temp;
  scanf("%d %d", &n, &m);
  int arr[100];
  for (int i = 1; i <= n; i++) {
    arr[i] = i;
  }
  int i, j;

  for (int k = 1; k <= m; k++) {
    scanf("%d %d", &i, &j);
    swap(&arr[i], &arr[j]);
  }
  for (int k = 1; k <= n; k++) {
    printf("%d ", arr[k]);
  }
}

✅성능 및 결과

profile
HYU_INFOSYS 23

0개의 댓글