촉촉한초코칩
[백준] 10811(바구니 뒤집기) c언어 본문
문제
도현이는 바구니를 총 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");
}
}
- ball에서 역순으로 배치할 인덱스 값을 개수만큼 tmp에 복사하고
- ary_reverse에서 역순으로 저장
- 그리고 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의 인덱스 값 바꾸기
이게 되나? 싶어서 써보면서 해봤다.
나는 언제쯤 이런 사고로 코드를 짤 수 있을까..........?
'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 |