안경잡이 구루루

백준 10811 (바구니 뒤집기) [C programming] [Implemention/구현] 본문

카테고리 없음

백준 10811 (바구니 뒤집기) [C programming] [Implemention/구현]

구루루(gururu) 2023. 11. 17. 11:44
반응형


나:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main() {
	int n, m, i, j;
	int p, q, r, l;
	int basket[100];
	int temp;
	scanf("%d %d", &n, &m);

	for (l = 0; l < n; l++) {
		basket[l] = l + 1;
	}

	for (p = 0; p < m; p++) {
		scanf("%d %d", &i, &j);
		for(q=j,r=i; q>(i+j)/2 ;q--,r++){
			temp = basket[r - 1];
			basket[r-1] = basket[q-1];
			basket[q - 1] = temp;
		}
	}
	for (l = 0; l < n; l++) {
		printf("%d ", basket[l]);
	}
	return 0;
}

완성된 코드는 위와 같다.

우선 VS에서 scanf() 오류를 막기 위해 #define _CRT_SECURE_NO_WARNINGS 를 선언

 

(1)
int n, m, i, j;
int p, q, r, l;
int basket[100];
int temp;
scanf("%d %d", &n, &m);

for (l = 0; l < n; l++) {
    basket[l] = l + 1;
}

문제에서 변수로 사용하는 n, m, i, j 를 정수형으로 선언.

그리고 나중에 반복문에서 사용하기 위한 변수 p, q, r, l 을 정수형으로 선언.

그리고 총 바구니는 n개 와 같으니 n의 최댓값인 100을 이용해 basket[100] 배열 선언하고 바구니 순서를 바꿀 때 잠시 값을 넣어둘 변수인 temp 선언.

다음으로 l을 이용한 반복문의 경우 바구니에 들어간 수는 바구니의 인덱스 위치값+1 과 같음으로 배열의 0 부터 n-1 까지 l+1을 대입한다.

(2)
for (p = 0; p < m; p++) {
    scanf("%d %d", &i, &j);
    for(q=j,r=i; q>(i+j)/2 ;q--,r++){
        temp = basket[r - 1];
        basket[r-1] = basket[q-1];
        basket[q - 1] = temp;
		}
}

for (l = 0; l < n; l++) {
    printf("%d ", basket[l]);
}

두 번째 이중중첩 반복문의 경우 바구니의 순서를 역순으로 만드는 방법을 구현한 것으로 코드에 대한 설명은 아래와 같다.

총 반복 횟수는 m 과 같음으로 p 를 이용한 반복문을 통해 이를 구현하고 이때 역순으로 바꿀 바구니의 순서 i, j 를 입력받는다.

그리고 q, r 을 이용한 중첩 반복문을 통해 앞서 입력받은 i, j 를 이용해 바구니의 순서를 역순으로 바꾼다.

순서대로 바구니의 순서를 역순으로 만들어야 함으로 r = i, q = j 를 반영해서 한번 반복이 끝날 때 마다 각각 증가, 감소하도록 했다.

이때 종결 조건은 ( i + j ) / 2 를 이용했는데 그이유는 절반만 진행해도 역순을 구현할 수 있어 역순으로 바꾸는 과정을 최소화 시킬 수 있고 역순으로 또 바꾸는 불상사를 막을 수 있다

( ex. 문제에서 '예제 입력 1'에서 이를 확인해 보면 i = 1, j = 4 일 때 종결조건을 절반으로 설정하지 않는다면 i=2, j=3 의 순서를 바꾸고 i=3, j=2 일 때 또 순서를 바꾸게 되어 다시 원래 순서로 돌아오게 된다. )

마지막으로 l 을 이용한 반복으로 바구니개수 n 만큼 basket 배열에 저장된 값들을 순서대로 공백으로 구분해 출력한다.

반응형