촉촉한초코칩

[백준] 10811(바구니 뒤집기) c언어 본문

Algorithm

[백준] 10811(바구니 뒤집기) c언어

햄친구베이컨 2023. 6. 11. 00:23

문제

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2번째 바구니, ..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다. 

도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.

바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.

둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다. 방법은 i j로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 역순으로 만든다는 뜻이다. (1 ≤ i ≤ j ≤ N)

도현이는 입력으로 주어진 순서대로 바구니의 순서를 바꾼다.

출력

모든 순서를 바꾼 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.

 


 

#include <stdio.h>
#include <stdlib.h>

/*--- type형의 x와 y 값을 교환 ---*/
#define swap(type, x, y) do { type t = x; x = y; y = t;} while (0)

void ary_reverse(int a[], int b[], int n) {
	for (int i = 0; i < n / 2; i++)
	    swap(int, a[i], a[n - i - 1]);
}

int main(void) {
  int n, m;
  scanf("%d %d", &n, &m);
  int i, j, cnt;

  int *ball, *tmp;
  ball = (int*)malloc(sizeof(int) * n);

  for(int x=0; x<n; x++) {
    ball[x] = x+1;
  }
  
  for(int x=0; x<m; x++) {
    scanf("%d %d", &i, &j); //1 2 
    cnt = j-i;
    tmp = (int*)malloc(sizeof(int) * cnt+1);

    for(int y=0; y<=cnt; y++) {
      tmp[y] = ball[i-1];
      i++;
    }

    ary_reverse(tmp, ball, cnt+1);

    printf("3\n");

    for(int z=i; z<=j; z++) {
      printf("test 3\n");
      ball[z-1] = tmp[z-1];
    }

    for(int x = 0; x<n; x++) {
      printf("%d ", ball[x]);
    }
    printf("\n");
  }
}

 

  1. ball에서 역순으로 배치할 인덱스 값을 개수만큼 tmp에 복사하고 
  2. ary_reverse에서 역순으로 저장
  3. 그리고 tmp 값을 다시 ball에 복사 

하려고 했는데... ary_reverse 함수 이후 바로 있는 for문 실행이 안되서 막힘...

모르겠어요.......

 

검색해본 결과

배열은 하나만 써서 swap 함수 돌리기 

#include <stdio.h>

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

int main() {

  int n, m, a, b;
	int arr[100];
	scanf("%d %d", &n, &m);

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

	while(m--) {
		scanf("%d %d", &a, &b);

		for(int i = 0; i <= (b - a) / 2; i++) {
			swap(&arr[a + i], &arr[b - i]);
		}
	}

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

  return 0;
}
  • (b-a) / 2 : 역순으로 배치해야 할 횟수 (역순이니까 나누기 2하기)
  • 그리고 a와 b의 인덱스 값 바꾸기 

이게 되나? 싶어서 써보면서 해봤다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

나는 언제쯤 이런 사고로 코드를 짤 수 있을까..........?

 

참고 : https://goalsdhkdwk.tistory.com/entry/BOJ%EB%B0%B1%EC%A4%80-10811%EB%B2%88-%EB%B0%94%EA%B5%AC%EB%8B%88-%EB%92%A4%EC%A7%91%EA%B8%B0-cc-%ED%92%80%EC%9D%B4

'Algorithm' 카테고리의 다른 글

[백준] 2444(별 찍기 - 7) c언어  (0) 2023.06.25
[미해결][백준] 25192(인사성 밝은 곰곰이) c언어  (0) 2023.06.16
11. 해시  (0) 2023.06.08
10. 트리  (0) 2023.06.08
09. 리스트  (0) 2023.06.05