Algorythm/백준 BEAKJOON

[C] 백준 BEAKJOON 2164번: 카드2

gapsoo 2023. 9. 27. 02:01

 

 

 

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

 

2164번: 카드2

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

www.acmicpc.net

 


 

 

잘 모르겠다... 여러가지 방법을 시도해보았는데,

진짜 혹시나해서 제출했는데 역시나 틀렸다.

 

 

구글링을 통해 정답을 알아보았다.

(참고: https://jootopia0808.tistory.com/111, https://blog.naver.com/kim-nan-hee/221901814483 )

 

 

 

 


[1] 정답 코드

 

#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;
}

 

 

 

 


[2] 해석

 

도움을 받았다... 정답 코드를 봐도 이해가 안 됐다. 🥲🥲🥲

 

 

1. int n, i, front=0, rear;: 정수형 변수 n, i, front, rear을 선언한다. front는 현재 카드 덱의 맨 앞 인덱스를 나타내고, rear는 현재 카드 덱의 맨 뒤 인덱스를 나타낸다.


2. int que[size];: 크기가 size인 정수 배열 que를 선언한다. 이 배열은 카드를 담을 공간이다.


3. scanf("%d", &n);: 사용자로부터 정수를 입력 받아 n에 저장한다.


4. for(i=0; i<n; i++) que[i]=i+1;: 1부터 N까지의 번호가 붙은 카드를 que 배열에 초기화한다.


5. rear=n-1;: rear 변수를 초기화한다. 처음에는 카드 덱이 꽉 차있으므로 n-1로 설정한다.


6. while(1) { ... }: 무한 루프를 시작한다.


7. front=(front+1)%n;: 현재 맨 앞의 카드를 버리고 front를 업데이트한다.


8. if(rear==front) break;: 만약 rear와 front가 같아진다면 무한 루프를 종료하고 다음 단계로 넘어간다. 이는 마지막 카드가 남았을 때의 조건이다.


9. rear=(rear+1)%n;: rear를 업데이트하여 맨 뒤로 옮긴다.


10. que[rear]=que[front];: 맨 앞의 카드를 맨 뒤로 옮긴다.

 

11. front=(front+1)%n;: 맨 앞의 카드를 버리고 front를 업데이트한다.


12. if(rear==front) break;: 만약 rear와 front가 같아진다면 무한 루프를 종료하고 다음 단계로 넘어간다.

 

 

 


[3] 느낀 점

 

 

 

이 정도 문제를 스스로 생각해서 풀어내려면 얼마나 많은 노력이 필요할까...?

그런 날이 왔으면 좋겠다. 근데 푸는 사람이 존재하니까 문제도 있는 거겠지? 열심히 해야겠다.