2164: 카드2

2022. 5. 25. 00:07C언어/백준

-Class2 : Silver5

https://www.acmicpc.net/problem/2164

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

 

-결과

 

-코드

#include <stdio.h>
#define size 500000
int main()
{
	int n, i, front=0, rear;
	int que[size];
	scanf("%d", &n);
	
	for(i=0; i<n; i++) que[i]=i+1;
	rear=n-1;
	
	while(1) {
		front=(front+1)%n;
		if(rear==front) break;
		rear=(rear+1)%n;
		que[rear]=que[front];
		front=(front+1)%n;
		if(rear==front) break;
	}
	printf("%d", que[rear]);
	return 0;
}

 

-풀이

카드의 개수를 입력받고 제일 위에 있는 카드를 버린 후 제일 위에 있는 카드를 맨 아래로 넣는 것을 계속 반복하는 문제이다.

이 문제는 큐를 이용해서 풀면 되는데 입력 사이즈가 500000개가 넘기 때문에 메모리를 아끼기 위해 원형큐를 사용해야 한다.

헤드포인터인 front 값을 1 증가시키고, rear값과 front값이 같다면 원형큐에 숫자가 1개 남아있다는 의미이므로 반복문을 벗어난다. rear에 1을 증가하고, que[rear]에 que[front]을 대입하고 front에 1을 증가한 후 rear값과 front값이 같다면 원형큐에 숫자가 1개 남아있다는 의미이므로 반복문을 벗어난다.

'C언어 > 백준' 카테고리의 다른 글

11866: 요세푸스 문제 0  (0) 2022.06.17
4949: 균형잡힌 세상  (0) 2022.05.25
1978: 소수 찾기  (0) 2022.05.24
1920: 수 찾기  (0) 2022.05.21
11651: 좌표 정렬하기 2  (0) 2022.05.21